题目大意:给出一个字符串,将其分解为若干子串的和,求可分解的最多子串的个数。
做题之前就知道这是一道KMP的题目,但一直没想到怎么写 后面看了下别人的思路(最近写题总是会忍不住看别人的思路 惭愧。。) 得出结论: 一个串的周期子串长度=主串长-next[主串长度]. 然后再用主串长除以周期子串长度就得到了子串周期长度。
下面贴代码
#include "iostream"
using namespace std;
#define len 1000020
char c[len];
int next[len];
int clen;
void getnext()
{
int i;
int j;
i=0;
j=-1;
next[0]=-1;
while (i<clen)
{
if (j==-1||c[i]==c[j])
{
i++;
j++;
next[i]=j;
}
else
{
j=next[j];
}
}
}
int main()
{
while (true)
{
scanf("%s",c);
if (c[0]=='.')
{
break;
}
clen=strlen(c);
getnext();
int t=clen-next[clen];
if (c[clen-1]!=c[t-1])
{
printf("1\n");//注意考虑如aabaabaa 这种结果为1的情况
}
else
{
printf("%d\n",clen/(clen-next[clen]));
}
}
return 0;
}