1. 程式人生 > >uva 1328(kmp)

uva 1328(kmp)

pri pan .... space pre print name 延伸 const

被打哭了......神特麽kmp,還能這麽用!看來我理解的還不夠透徹,這裏最神奇的就是只有相同的字串才能往下延伸,而"i-f[i]"就正好是前面空出來的模板塊,也就是f[i]中不計數的那塊,而字符串都是從0開始的,對應的往下加一個卻正好成立構成倍數關系

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1000000+100;
int f[maxn];
string p;
int n;
int main() { int kase=0; while(~scanf("%d",&n)&&n) { kase++; cin >> p; f[0]=0,f[1]=0; for(int i=1; i<n; i++) { int j=f[i]; while(j&&p[i]!=p[j]) j=f[j]; f[i+1]=(p[i]==p[j]?j+1:0); } printf(
"Test case #%d\n",kase); for(int i=2; i<=n; i++) if(f[i]>0&&i%(i-f[i])==0) { printf("%d %d\n",i,i/(i-f[i])); } printf("\n"); } return 0; }

,很神奇,這是什麽,規律?

uva 1328(kmp)