KMP-[POI2005]SZA-Template-解题报告
发这篇题解完全是因为题解里的方法都好麻烦啊...好像是我们暑假考试的题
我们肯定是要KMP求出next数组(以下可能简称nx),然后想办法DP。
我们直接设
然后我们考虑,
什么时候答案才能为
具体实现的话开一个桶即可。
#define N 500005
int n;
int nx[N];
int f[N],h[N];
char s[N];
signed main()
{
#ifdef M207
freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
#endif
scanf("%s",s+1); n=strlen(s+1);
nx[0]=-1;
for(ri i=2,j=0; i<=n; ++i)
{
while(j!=-1&&s[j+1]!=s[i]) j=nx[j];
nx[i]=++j;
}
f[1]=1;
for(ri i=2; i<=n; ++i)
{
f[i]=i;
if(h[f[nx[i]]]>=i-nx[i]) f[i]=f[nx[i]];
h[f[i]]=i;
}
out(f[n]);
return 0;
}