本题是一道KMP算法的经典入门题,博主就是用这道题为契机学习的KMP算法。
在这里总结一下KMP算法学习的一点点经验,希望可以帮到后来的各位:
KMP算法建议先看懂算法的思路,然后找一个示例程序或者模板(当然一定要找个正确的模板或示例),自己找两个字符串,在纸上按照程序执行的顺序把每一步都写出来,这样对这个算法的理解会比较深刻一些。
其实,很多算法都是,在纸上按照程序执行过程走一遍,理解就会比较深刻了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstdlib>
#include<string>
#include<cassert>
#include<set>
#include<vector>
#include<stack>
#include<queue>
#include<map>
using namespace std;
char s[1000005];
int nxt[1000005];
int l;
void getnext()
{
int j = 0, k = -1;
nxt[0] = -1;
while (j<l)
{
if (k == -1 || s[j] == s[k])
{
j++;k++;
if (s[j] != s[k])
nxt[j] = k;
else
nxt[j] = nxt[k];
}
else k = nxt[k];
}
}
int main()
{
int ans;
while (scanf("%s", s) && strcmp(s, "."))
{
ans = 1;
l = strlen(s);
getnext();
if (l % (l - nxt[l]) == 0)
ans = l / (l - nxt[l]);
cout << ans << endl;
}
return 0;
}