码迷,mamicode.com
首页 > 其他好文 > 详细

Power Strings POJ - 2406

时间:2017-10-14 18:33:33      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:names   nbsp   mes   pen   algorithm   play   oid   code   origin   

Power Strings

 POJ - 2406 

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 }
View Code

 

Power Strings POJ - 2406

标签:names   nbsp   mes   pen   algorithm   play   oid   code   origin   

原文地址:http://www.cnblogs.com/yijiull/p/7667931.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!