1 UVALive 3942 Remember the Word

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 #include <queue>
 7 #include <vector>
 8 #include <stack>
 9 #include <map>
10 #include <set>
11 #include <cmath>
12 #include <cctype>
13 #include <ctime>
14 
15 using namespace std;
16 
17 #define REP(i, n) for (int i = 0; i < (n); ++i)
18 #define eps 1e-9
19 
20 typedef long long ll;
21 typedef pair<int, int> pii;
22 
23 const int INF = 0x7fffffff;
24 const int maxn = 4e5 + 10;
25 const int mod = 20071027;
26 char str[maxn], str_t[110];
27 int n, sz, Case = 0, ans;
28 int ch[maxn][26], val[maxn], len[maxn], dp[maxn];
29 
30 inline void init() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); }
31 inline int get_id(char c) { return c - 'a'; }
32 void insert(char *s, int _val) {
33     int u = 0, len_t = strlen(s), id;
34     for (int i = 0; i < len_t; ++i) {
35         id = get_id(s[i]);
36         if (!ch[u][id]) {
37             memset(ch[sz], 0, sizeof(ch[sz]));
38             val[sz] = 0; ch[u][id] = sz++;
39         }
40         u = ch[u][id];
41     }
42     val[u] = _val;
43 }
44 void find_prefixs(int pos, int len_t) {
45     int u = 0, id;
46     for (int i = pos; i < len_t; ++i) {
47         id = get_id(str[i]);
48         if (!ch[u][id]) { break; }
49         u = ch[u][id];
50         if (val[u] != 0) { dp[pos] += dp[pos + len[val[u]]]; dp[pos] %= mod; }
51     }
52 }
53 
54 
55 int main() {
56 #ifdef __AiR_H
57     freopen("in.txt", "r", stdin);
58 //    freopen("out.txt", "w", stdout);
59 #endif // __AiR_H
60     while (scanf("%s", str) != EOF) {
61         scanf("%d", &n); ans = 0; init();
62         for (int i = 1; i <= n; ++i) {
63             scanf("%s", str_t); insert(str_t, i); len[i] = strlen(str_t);
64         }
65         memset(dp, 0, sizeof(dp));
66         int len_t = strlen(str); dp[len_t] = 1;
67         for (int i = len_t - 1; i >= 0; --i) {
68             find_prefixs(i, len_t);
69         }
70         printf("Case %d: %d\n", ++Case, dp[0]);
71     }
72 #ifdef __AiR_H
73     printf("Time used = %.2fs\n", (double)clock() / CLOCKS_PER_SEC);
74 #endif // __AiR_H
75     return 0;
76 }
View Code

 

2 Uva 11732 "strcmp()" Anyone?

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 #include <queue>
 7 #include <vector>
 8 #include <stack>
 9 #include <map>
10 #include <set>
11 #include <cmath>
12 #include <cctype>
13 #include <ctime>
14 
15 using namespace std;
16 
17 #define REP(i, n) for (int i = 0; i < (n); ++i)
18 #define eps 1e-9
19 
20 typedef long long ll;
21 typedef pair<int, int> pii;
22 
23 const int INF = 0x7fffffff;
24 const int maxn = 4e6 + 10;
25 int head[maxn], Next[maxn], tot[maxn];
26 char ch[maxn], str_t[1010];
27 int sz, n, Case = 0;
28 ll ans = 0;
29 
30 void init() { sz = 1; tot[0] = head[0] = Next[0] = 0; }
31 void insert(char *s) {
32     int u = 0, v, len_t = strlen(s);
33     bool found; ++tot[0];
34     for (int i = 0; i <= len_t; ++i) {
35         found = false;
36         for (v = head[u]; v != 0; v = Next[v]) {
37             if (ch[v] == s[i]) { found = true; break; }
38         }
39         if (!found) {
40             v = sz++; tot[v] = 0; ch[v] = s[i];
41             Next[v] = head[u]; head[u] = v; head[v] = 0;
42         }
43         u = v; ++tot[u];
44     }
45 }
46 void dfs(int u, int depth) {
47     if (!head[u]) { ans += 1ll * tot[u] * (tot[u] - 1) * depth; return; }
48     ll sum = 0;
49     for (int v = head[u]; v != 0; v = Next[v]) {
50         sum += 1ll * tot[v] * (tot[u] - tot[v]);
51     }
52     ans += sum / 2 * (2 * depth + 1);
53     for (int v = head[u]; v != 0; v = Next[v]) {
54         dfs(v, depth + 1);
55     }
56 }
57 
58 
59 int main() {
60 #ifdef __AiR_H
61     freopen("in.txt", "r", stdin);
62 //    freopen("out.txt", "w", stdout);
63 #endif // __AiR_H
64     while (scanf("%d", &n) && n) {
65         init();
66         while (n--) { scanf("%s", str_t); insert(str_t); }
67         ans = 0; dfs(0, 0);
68         printf("Case %d: %lld\n", ++Case, ans);
69     }
70 #ifdef __AiR_H
71     printf("Time used = %.2fs\n", (double)clock() / CLOCKS_PER_SEC);
72 #endif // __AiR_H
73     return 0;
74 }
View Code

 

3  Uva 11488 Hyper Prefix Sets

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 #include <queue>
 7 #include <vector>
 8 #include <stack>
 9 #include <map>
10 #include <set>
11 #include <cmath>
12 #include <cctype>
13 #include <ctime>
14 
15 using namespace std;
16 
17 #define REP(i, n) for (int i = 0; i < (n); ++i)
18 #define eps 1e-9
19 
20 typedef long long ll;
21 typedef pair<int, int> pii;
22 
23 const int INF = 0x7fffffff;
24 const int maxn = 1e6;
25 int T, n, sz, ans;
26 char str_t[210];
27 int ch[maxn][2], cnt[maxn];
28 
29 inline void init() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); }
30 inline int get_id(char c) { return c - '0'; }
31 void insert(char *s) {
32     int u = 0, len_t = strlen(s), id;
33     for (int i = 0; i < len_t; ++i) {
34         id = get_id(s[i]);
35         if (!ch[u][id]) {
36             memset(ch[sz], 0, sizeof(ch[sz]));
37             cnt[sz] = 1; ch[u][id] = sz++; u = ch[u][id];
38         } else {
39             ++cnt[ch[u][id]]; u = ch[u][id];
40         }
41     }
42 }
43 void dfs(int u, int depth) {
44     if (u == 0 && depth != 0) { return; } ans = max(ans, cnt[u] * depth);
45     for (int i = 0; i < 2; ++i) {
46         dfs(ch[u][i], depth + 1);
47     }
48 }
49 
50 
51 int main() {
52 #ifdef __AiR_H
53     freopen("in.txt", "r", stdin);
54 //    freopen("out.txt", "w", stdout);
55 #endif // __AiR_H
56     scanf("%d", &T);
57     while (T--) {
58         scanf("%d", &n); init(); ans = 0;
59         for (int i = 0; i < n; ++i) {
60             scanf("%s", str_t); insert(str_t);
61         }
62         dfs(0, 0); printf("%d\n", ans);
63     }
64 #ifdef __AiR_H
65     printf("Time used = %.2fs\n", (double)clock() / CLOCKS_PER_SEC);
66 #endif // __AiR_H
67     return 0;
68 }
View Code