又是纯KMP算法
昨晚太晚了,浏览了下题目,就好困,然后就睡觉去了
今天早上坐公交的时候开始想了下这个题目,就想出来做法了。(PS.长沙周一上班高峰,公交真TM挤。地铁遥遥无期啊)。
做法如下:
只需用KMP算法求出next数组值,这个具体求法我昨晚的日志写的很清晰。
在求的过程中,用一个变量记录最新的失配处的位置,这样,初始点到失配点的字符串,即为重复母串,比如ababab,从第三位到最后一位均可匹配,因此失配点即为第二位,b。。因此结果就是总位数6/2=3;
当然之前想简单了,比如abababa,如果按上述做法,也会输出3.因为它的next值为0012345,明显失配处好像是第二位。。。实则要加入判断条件:如果总位数%重复母船长度!=0,则重复母串不存在,直接输出1.
#include <iostream> #include <cstdio> using namespace std; char str[1000005]; int next[1000005]; int knext() { int mini=0; next[0]=0; int i,j=0; for (i=1;str[i]!='\0';i++) { if (str[i]==str[j]) j++; else
{ while (j>0&&str[j]!=str[i]) j=next[j-1];
if (str[j]==str[i]) j++;
} next[i]=j; if (next[i]!=next[i-1]) mini=i-j;//当前失配,记录最新失配点。 } if (i%(mini+1)==0)//如果重复母串根本不能构成总串,说明根本不是重复母串。 return i/(mini+1); else return 1; } int main() { while (gets(str)) { if (str[0]=='.') break; printf("%d\n",knext()); } return 0; }