Dominating Patterns
每次看着别人的代码改成自己的模板都很头大。。。空间少了个0卡了好久
裸题,用比map + string更高效的vector代替蓝书中的处理方法
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <queue> 7 #include <vector> 8 #include <cmath> 9 #define min(a, b) ((a) < (b) ? (a) : (b)) 10 #define max(a, b) ((a) > (b) ? (a) : (b)) 11 #define abs(a) ((a) < 0 ? (-1 * (a)) : (a)) 12 inline void swap(int &a, int &b) 13 { 14 long long tmp = a;a = b;b = tmp; 15 } 16 inline void read(int &x) 17 { 18 x = 0;char ch = getchar(), c = ch; 19 while(ch < ‘0‘ || ch > ‘9‘) c = ch, ch = getchar(); 20 while(ch <= ‘9‘ && ch >= ‘0‘) x = x * 10 + ch - ‘0‘, ch = getchar(); 21 if(c == ‘-‘) x = -x; 22 } 23 24 const int INF = 0x3f3f3f3f; 25 const int MAXNODE = 150 * 70 * 10; 26 27 int ch[MAXNODE][30], last[MAXNODE], root = 0, tag[MAXNODE], fail[MAXNODE], cnt, tot[MAXNODE]; 28 std::vector<int> node[MAXNODE]; 29 char s[1600][800]; 30 31 void insert(int x) 32 { 33 int now = root; 34 for(int i = 1;s[x][i] != ‘\0‘;++ i) 35 { 36 int& tmp = ch[now][s[x][i] - ‘a‘ + 1]; 37 if(tmp) now = tmp; 38 else now = tmp = ++ cnt; 39 } 40 ++ tag[now]; 41 node[now].push_back(x); 42 } 43 44 int q[MAXNODE], he, ta, ma; 45 void build() 46 { 47 he = 0, ta = 0; 48 49 for(register int i = 1;i <= 26;++ i) 50 { 51 int u = ch[root][i]; 52 if(u) q[ta ++] = u, fail[u] = last[u] = 0; 53 } 54 55 while(he < ta) 56 { 57 int now = q[he ++]; 58 for(register int i = 1;i <= 26;++ i) 59 { 60 int u = ch[now][i]; 61 if(!u) 62 { 63 ch[now][i] = ch[fail[now]][i]; 64 continue; 65 } 66 q[ta ++] = u; 67 int v = fail[now]; 68 while(v && !ch[v][i]) v = fail[v]; 69 fail[u] = ch[v][i]; 70 last[u] = tag[fail[u]] ? fail[u] : last[fail[u]]; 71 } 72 } 73 } 74 75 76 int n; 77 char T[1100000]; 78 79 void find() 80 { 81 int n = strlen(T + 1); 82 int j = root; 83 for(register int i = 1;i <= n;++ i) 84 { 85 int c = T[i] - ‘a‘ + 1; 86 j = ch[j][c]; 87 if(tag[j]) for(int k = 0;k < node[j].size();++ k) ++ tot[node[j][k]], ma = max(ma, tot[node[j][k]]); 88 else if(last[j]) for(int k = 0;k < node[last[j]].size();++ k) ++ tot[node[last[j]][k]], ma = max(ma, tot[node[last[j]][k]]); 89 } 90 } 91 92 int main() 93 { 94 while(scanf("%d", &n) != EOF && n) 95 { 96 ma = 0, memset(tot, 0, sizeof(tot)), memset(ch, 0, sizeof(ch)), memset(tag, 0, sizeof(tag)); 97 for(register int i = 1;i <= cnt;++ i) node[i].clear(); 98 cnt = 1; 99 for(register int i = 1;i <= n;++ i) 100 { 101 scanf("%s", s[i] + 1); 102 insert(i); 103 } 104 build(); 105 scanf("%s", T + 1); 106 find(); 107 printf("%d\n", ma); 108 for(register int i = 1;i <= n;++ i) 109 if(tot[i] == ma) printf("%s\n", s[i] + 1); 110 } 111 return 0; 112 }