HDU 4763
KMP算法的应用,第一遍做想的有点复杂,想开一个hash数组维护,实践时候才发现兜兜转转一圈徒增代码复杂度,最后时空复杂度也上来了。好的算法一个很重要的特性就是可编写性。
#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <stack>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxl= 1e6+5;
char s[maxl];
int nx[maxl], kn[maxl];
void PreKmp(char *x, int m, int *n, int *kn)
{
int i= 0, j= -1;
kn[0]= n[0]= -1;
while (i< m){
while (j> -1 && x[i]!= x[j]){
j= kn[j];
}
++i;
++j;
if (x[i]== x[j]){
kn[i]= kn[j];
}
else{
kn[i]= j;
}
n[i]= j;
}
}
int main(int argc, char const *argv[])
{
int N;
scanf("%d", &N);
while (N--){
scanf(" %s", s);
int l= strlen(s);
PreKmp(s, l, nx, kn);
int k= nx[l], flag= 0;
while (k> 0){
int ui= l-k;
int i= k, j= 0;
while (i< ui){
while (j> -1 && s[i]!= s[j]){
j= kn[j];
}
++i;
++j;
if (j>= k){
flag= 1;
}
}
if (flag){
break;
}
else if (!flag){
k= nx[k];
}
}
printf("%d\n", k> 0 ? k : 0);
}
return 0;
}