给出模板串S和串T,长度分别为Slen和Tlen,在线性时间内,对于每个S[i](0<=i<Slen),求出S[i..Slen-1]与T的
最长公共前缀长度,记为extend[i],extend[i]存放s[i]开始与T的最长公共前缀长度。
例子
a a a a a a a b b b
a a a a a c
extend 5 4 3 2 1 0 0 0 0 0
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 26531 Accepted Submission(s): 5860
if(extend[i] >= m) equ++;
else if(y[i+extend[i]] < x[extend[i]]) small++;
else big++;
最后要注意有几个循环结点,除以循环结点
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 6 using namespace std; 7 typedef long long LL; 8 9 void pre_EKMP(char x[], int m, int next[]) { 10 next[0] = m; 11 int j = 0; 12 while(j+1<m && x[j] == x[j+1]) j++; 13 next[1] = j; 14 int k = 1; 15 for(int i = 2; i< m; i++) { 16 int p = next[k] + k -1; 17 int L = next[i-k]; 18 if(i+L < p+1) next[i] = L; 19 else { 20 j = max(0, p-i+1); 21 while(i+j < m && x[i+j] == x[j]) j++; 22 next[i] = j; 23 k = i; 24 } 25 } 26 } 27 28 void EKMP(char x[], int m, char y[],int n, int next[], int extend[]) { 29 pre_EKMP(x,m,next); 30 int j = 0; 31 while(j <n && j <m && x[j] == y[j]) j++; 32 extend[0] = j; 33 int k = 0; 34 for(int i = 1;i < n ;i++) { 35 int p = extend[k]+k-1; 36 int L=next[i-k]; 37 if(i+L < p+1) extend[i] = L; 38 else { 39 j = max(0,p-i+1); 40 while(i+j < n && j < m && y[i+j] == x[j]) j++; 41 extend[i] = j; 42 k = i; 43 } 44 } 45 } 46 int main() 47 { 48 int T; 49 char x[200010],y[200010]; 50 int next[200010], extend[200010]; 51 int k = 1; 52 scanf("%d",&T); 53 while(T--) { 54 int equ = 0, small = 0, big = 0; 55 scanf("%s",x); 56 strcpy(y,x); 57 strcat(y,x); 58 int m = strlen(x), n = strlen(y); 59 EKMP(x,m,y,n,next,extend); 60 int cnt = 0; 61 for(int i = 0; i < m;i++)//此循环用于判断有几个循环结 62 if(extend[i] == extend[0]) 63 cnt++; 64 for(int i = 0; i < m; i++) {//数值比较大小 65 if(extend[i] >= m) equ++; 66 else if(y[i+extend[i]] < x[extend[i]]) small++; 67 else big++; 68 } 69 printf("Case %d: ",k++); 70 printf("%d %d %d\n",small/cnt,equ/cnt,big/cnt); 71 72 } 73 return 0; 74 }
扩展KMP,附上例题(HDU - 4333 Revolving Digits)
原文:http://www.cnblogs.com/creativepower/p/7514547.html