Power Strings POJ - 2406
Posted yijiull
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Power Strings POJ - 2406相关的知识,希望对你有一定的参考价值。
Power Strings
kmp可以过的
学了sa就用sa搞一下,,一直TLE...
好像要用另外一种方法实现,还没学=_=
先放上超时的代码吧
1 //#include <bits/stdc++.h> 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 const int maxn = 1000010; 8 char s[maxn]; 9 int sa[maxn], t1[maxn], t2[maxn], c[maxn]; 10 int h[maxn], rk[maxn]; 11 int n; 12 void build_sa(int n, int m){ 13 int i, *x = t1, *y = t2; 14 for(i = 0; i < m; i++) c[i] = 0; 15 for(i = 0; i < n; i++) c[x[i] = s[i]]++; 16 for(i = 1; i < m; i++) c[i] += c[i-1]; 17 for(i = n-1; i >= 0; i--) sa[--c[x[i]]] = i; 18 for(int k = 1; k <= n; k <<= 1){ 19 int p = 0; 20 for(i = n-k; i < n; i++) y[p++] = i; 21 for(i = 0; i < n; i++) if(sa[i] >= k) y[p++] = sa[i]-k; 22 for(i = 0; i < m; i++) c[i] = 0; 23 for(i = 0; i < n; i++) c[x[y[i]]]++; 24 for(i = 1; i< m; i++) c[i] += c[i-1]; 25 for(i = n-1; i >= 0; i--) sa[--c[x[y[i]]]] = y[i]; 26 swap(x,y); 27 p = 1; 28 x[sa[0]] = 0; 29 for(i = 1; i < n; i++) 30 x[sa[i]] = y[sa[i]]==y[sa[i-1]] && y[sa[i]+k]==y[sa[i-1]+k]? p-1 : p++; 31 if(p>=n) break; 32 m=p; 33 } 34 } 35 void geth(int n){ 36 int i, j, k=0; 37 for(i = 0; i < n; i++) rk[sa[i]]=i; 38 for(i = 0; i < n; i++) { 39 if(k) k--; 40 j = sa[rk[i]-1]; 41 while(s[i+k]==s[j+k]) k++; 42 h[rk[i]] = k; 43 } 44 } 45 int main(){ 46 while(scanf("%s", s)){ 47 if(s[0] == ‘.‘) break; 48 int n = strlen(s) + 1; //!!! 49 build_sa(n, 255); 50 geth(n); 51 int k; 52 n--; 53 for(k = 1; k <= n; k++){ 54 if(n%k==0 && h[rk[0]] == n-k) break; 55 } 56 printf("%d\n", n/k); 57 } 58 }
以上是关于Power Strings POJ - 2406的主要内容,如果未能解决你的问题,请参考以下文章