KMP算法的应用主要体现在Next数组的计算方式上。Next数组含义如下:
Next[i] = j, 表示下标 i 之前连续 j 个字符,和字符串开始的连续 j 个字符相同。这会带来很多应用。比如
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
char str[1001000];
int _next[1001000];
void get_next(char *str)
{
_next[0] = -1;
int i = 0, k = -1, len = strlen(str);
while(i < len)
{
while(k>=0 && str[i]!=str[k])
k = _next[k];
i++;
k++;
_next[i] = k;
}
for(int i=0;i<len;i++)
_next[i] = _next[i+1];
}
int main()
{
//freopen("in.txt", "r", stdin);
while(scanf("%s", str) && str[0]!='.')
{
get_next(str);
// cout<<"*********"<<endl<<str<<endl;
// for(int i=0;i<strlen(str);i++)
// cout<<_next[i]<<" ";
// cout<<endl;
int len = strlen(str);
if(_next[len-1]>0 && len%(len-_next[len-1]) == 0)
printf("%d\n", len/(len-_next[len-1]));
else
printf("1\n");
}
return 0;
}
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
int n, case_num = 1;
int _next[1001000];
string str;
void get_next(string s)
{
int len = s.length();
int i = 0, k = -1;
_next[0] = -1;
while(i < len)
{
while(k>=0 && s[i]!=s[k])
k = _next[k];
i++;
k++;
_next[i] = k;
}
for(int i=0;i<len;i++)
_next[i] = _next[i+1];
}
int main()
{
//freopen("in.txt", "r", stdin);
while(scanf("%d", &n) && n)
{
cin>>str;
printf("Test case #%d\n", case_num);
case_num++;
int len = str.length();
get_next(str);
for(int i=0;i<len;i++)
{
int now_len = i+1;
if(_next[i]>0 && now_len%(now_len-_next[i])==0)
printf("%d %d\n", now_len, now_len/(now_len-_next[i]));
}
printf("\n");
}
return 0;
}