P9753 [CSP-S 2023] 消消乐 题解
写一种考场上想到的线性做法。
根据性质,若
考虑 dp,设
由于
该做法的时间复杂度为
如果令
每次修改的值只有
时间复杂度:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e6+5;
int n,dp[N],a[N][26],to[N];
char s[N];
ll ans;
int main()
{
scanf("%d%s",&n,s+1);
for(int i=1;i<=n;i++)
{
to[i]=i;
int x=a[to[i-1]][s[i]-'a'];
if(x) to[i]=to[x-1],dp[i]=dp[x-1]+1;
a[to[i]][s[i]-'a']=i,ans+=dp[i];
}
printf("%lld\n",ans);
return 0;
}