题目链接:点击打开链接
题目分析:利用KMP进行分析,白书上的方法略有不同
其实就是进行预处理,找到上一个与之匹配的
总结:数组开小了,出现re
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,f[1000005];
char s[1000005];
int get_failure(int len)
{
memset(f,-1,sizeof(f));
int k=-1,j,i=0;
while(i<len)
{
if(k==-1||s[i]==s[k]) f[++i]=++k;
else k=f[k];
}
j=len-k;
if(len%j) return 1;
else return len/j;
}
int main()
{
while(~scanf("%s",s))
{
int len=strlen(s);
if(s[0]=='.')
break;
else
printf("%d\n",get_failure(len));
}
return 0;
}
另外附上
int get_failure(int len)
{
memset(f,0,sizeof(f));
int k,j,i;
for( i=1;i<len;i++)
{
k=f[i];
while(k&&s[i]!=s[k]) k=f[k];
f[i+1]=s[i]==s[k]?k+1:0;
}
}