bzoj1355

kmp转移函数可以计算后缀前缀匹配,同时对于循环节类问题,转移函数剩下部分即为循环节,即ans=l-kmp[l],要加深对算法本身的理解

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int maxn=1000002;
int l,f[maxn];
char s[maxn];
void init(){
scanf("%d\n",&l);
for (int i=1;i<=l;i++) scanf("%c",&s[i]);
}


void getfail(){
f[0]=0; f[1]=0;
int q=0;
for (int i=2;i<=l;i++){
while (s[i]!=s[q+1]&&(q>0)) q=f[q];
f[i]=q+=(s[i]==s[q+1]);
}
}


int main(){
init();
getfail();
printf("%d",l-f[l]);
return 0;
}

你可能感兴趣的:(bzoj1355)