题目链接:
https://jzoj.net/senior/#main/show/5178
题目:
题解:
我们定义$f[pos]$表示以位置pos为后缀的字符串对答案的贡献,答案就是$sum_{i=1}^{n} f[i]$
考虑怎么得到f数组,我们有$f[i]=f[nxt[i]]+[i是偶数]$
其实蛮显然的,$f[i]$和$f[nxt[i]]$除了多出前缀i这个贡献没什么区别
#include<algorithm> #include<cstring> #include<cstdio> #include<iostream> using namespace std; typedef long long ll; const int N=2e5+15; char ch[N]; int nxt[N],f[N]; int main() { scanf("%s",ch+1); nxt[1]=0; int n=strlen(ch+1); for (int i=2,j=0;i<=n;i++) { while (j&&ch[j+1]!=ch[i]) j=nxt[j]; if (ch[j+1]==ch[i]) ++j; nxt[i]=j; } for (int i=1;i<=n;i++) { if (!(i&1)) f[i]=f[nxt[i]]+1; else f[i]=f[nxt[i]]; } ll ans=0; for (int i=1;i<=n;i++) ans+=f[i]; printf("%d ",ans); return 0; }