bzoj2251: [2010Beijing Wc]外星联络

orz JT真是太神辣

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<algorithm>
 5 #include<iostream>
 6 
 7 using namespace std;
 8 
 9 void setIO(const string& s) {
10     freopen((s + ".in").c_str(), "r", stdin);
11     freopen((s + ".out").c_str(), "w", stdout);
12 }
13 template<typename Q> Q read(Q& x) {
14     static char c, f;
15     for(f = 0; c = getchar(), !isdigit(c); ) if(c == '-') f = 1;
16     for(x = 0; isdigit(c); c = getchar()) x = x * 10 + c - '0';
17     if(f) x = -x;
18     return x;
19 }
20 template<typename Q> Q read() {
21     static Q x; read(x); return x;
22 }
23 
24 
25 const int N = 3000 + 10;
26 
27 char s[N];
28 int sa[N], n;
29 void build_sa(int m) {
30     static int t1[N * 2], t2[N * 2], c[N];
31     int *x = t1, *y = t2;
32     for(int i = 0; i < m; i++) c[i] = 0;
33     for(int i = 0; i < n; i++) c[x[i] = s[i]]++;
34     for(int i = 1; i < m; i++) c[i] += c[i-1];
35     for(int i = 0; i < n; i++) sa[--c[x[i]]] = i;
36     
37     for(int k = 1; k < n; k <<= 1) {
38         int p = 0;
39         for(int i = n - 1; i >= n - k; i--) y[p++] = i;
40         for(int i = 0; i < n; i++) if(sa[i] >= k) y[p++] = sa[i]-k;
41         for(int i = 0; i < m; i++) c[i] = 0;
42         for(int i = 0; i < n; i++) c[x[i]]++;
43         for(int i = 1; i < m; i++) c[i] += c[i-1];
44         for(int i = n - 1; i >= 0; i--) sa[--c[x[y[i]]]] = y[i];
45         
46         p = 1, swap(x, y), x[sa[0]] = 0;
47         for(int i = 1; i < n; i++) {
48             x[sa[i]] = (y[sa[i]] == y[sa[i-1]] && y[sa[i]+k] == y[sa[i-1]+k]) ? p - 1 : p++;
49         }
50         if(p >= n) break;
51         m = p;
52     }
53 }
54 
55 int rank[N], height[N];
56 
57 void build_height() {
58     for(int i = 0; i < n; i++) rank[sa[i]] = i;
59     for(int k = 0, i = 0; i < n; i++) {
60         if(k) k--;
61         if(!rank[i]) continue;
62         int j = sa[rank[i]-1];
63         while(s[i+k] == s[j+k]) k++;
64         height[rank[i]] = k;
65     }
66 }
67 
68 int main() {
69 #ifdef DEBUG
70     freopen("in.txt", "r", stdin);
71     freopen("out.txt", "w", stdout);
72 #endif
73     
74     
75     scanf("%d%s", &n, s);
76     build_sa(256);
77     build_height();
78     
79     for(int R, L = 1; L < n; L++) {
80         for(int h = height[L-1] + 1; h <= height[L]; h++) {
81             for(R = L + 1; height[R] >= h; R++);
82             printf("%d\n", R - L + 1);
83         }
84     }
85     
86     return 0;
87 }
SuffixArray

 

暴力也兹辞

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<algorithm>
 5 #include<iostream>
 6 
 7 using namespace std;
 8 
 9 void setIO(const string& s) {
10     freopen((s + ".in").c_str(), "r", stdin);
11     freopen((s + ".out").c_str(), "w", stdout);
12 }
13 template<typename Q> Q read(Q& x) {
14     static char c, f;
15     for(f = 0; c = getchar(), !isdigit(c); ) if(c == '-') f = 1;
16     for(x = 0; isdigit(c); c = getchar()) x = x * 10 + c - '0';
17     if(f) x = -x;
18     return x;
19 }
20 template<typename Q> Q read() {
21     static Q x; read(x); return x;
22 }
23 
24 const int N = 3000 + 10;
25 
26 struct Trie {
27     const static int maxnode = N * N;
28     int ch[maxnode][2];
29     int val[maxnode];
30     int sz;
31     
32     int newnode() {
33         ch[sz][0] = ch[sz][1] = 0;
34         val[sz] = 0;
35         return sz++;
36     }
37     
38     void init() {
39         sz = 0;
40         newnode();
41     }
42     
43     void insert(const char *s) {
44         int u = 0, n = strlen(s);
45         for(int i = 0; i < n; i++) {
46             int c = s[i] - '0';
47             if(!ch[u][c]) ch[u][c] = newnode();
48             u = ch[u][c];
49             val[u]++;
50         }
51     }
52     
53     void dfs(int u) {
54         if(val[u] > 1) {
55             printf("%d\n", val[u]);
56         }
57         if(ch[u][0]) dfs(ch[u][0]);
58         if(ch[u][1]) dfs(ch[u][1]);
59     }
60 }trie;
61 
62 int main() {
63 #ifdef DEBUG
64     freopen("in.txt", "r", stdin);
65     freopen("out.txt", "w", stdout);
66 #endif
67     
68     trie.init();
69     int n;
70     char s[N];
71     scanf("%d%s", &n, s);
72     for(int i = 0; i < n; i++) {
73         trie.insert(s+i);
74     }
75     trie.dfs(0);
76     
77     return 0;
78 }
暴力!

 

转载于:https://www.cnblogs.com/showson/p/5078148.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值