锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
銆愰瑙c戯細(xì)鍚庣紑鏁扮粍緇忓吀棰樼洰銆?br /> 鍏堜簩鍒嗙瓟妗堬紝鎶婇鐩彉鎴愬垽瀹氭ч棶棰橈細(xì)鍒ゆ柇鏄惁瀛樺湪涓や釜闀垮害涓簁 鐨勫瓙涓叉槸鐩稿悓鐨勶紝涓斾笉閲嶅彔銆傝В鍐寵繖涓棶棰樼殑鍏抽敭鏄埄鐢╤eight 鏁扮粍錛屾妸鎺掑簭鍚庣殑鍚庣紑鍒嗘垚鑻ュ共緇勶紝鍏朵腑姣忕粍鐨勫悗緙涔嬮棿鐨刪eight鍊奸兘涓嶅皬浜巏銆?br /> 瀹規(guī)槗鐪嬪嚭錛屾湁甯屾湜鎴愪負(fù)鏈闀垮叕鍏卞墠緙涓嶅皬浜巏 鐨勪袱涓悗緙涓瀹氬湪鍚屼竴緇勩傜劧鍚庡浜庢瘡緇勫悗緙錛屽彧欏誨垽鏂瘡涓悗緙鐨剆a 鍊肩殑鏈澶у煎拰鏈灝忓間箣宸槸鍚︿笉灝忎簬k銆傚鏋滄湁涓緇勬弧瓚籌紝鍒欒鏄庡瓨鍦紝鍚﹀垯涓嶅瓨鍦ㄣ傛椂闂村鏉傚害涓篛(nlogn)銆?br />
銆愪唬鐮併戯細(xì)
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 #include "cmath"
8 #include "string"
9 #include "cctype"
10 #include "map"
11 #include "iomanip"
12 #include "set"
13 #include "utility"
14 using namespace std;
15 typedef pair<int, int> pii;
16 #define pb push_back
17 #define mp make_pair
18 #define fi first
19 #define se second
20 #define sof(x) sizeof(x)
21 #define lc(x) (x << 1)
22 #define rc(x) (x << 1 | 1)
23 #define lowbit(x) (x & (-x))
24 #define ll long long
25 #define maxn 20050
26 int wa[maxn], wb[maxn], wv[maxn], wc[maxn];
27 int r[maxn], sa[maxn], rank[maxn], height[maxn];
28 int n;
29
30 int cmp(int *r, int a, int b, int l) {
31 return r[a] == r[b] && r[a+l] == r[b+l];
32 }
33
34 void da() {
35 //m涓烘渶澶у瓧絎?/span>
36 int i, j, p, *x = wa, *y = wb, *t, m = 256;
37 for(i = 0; i < m; i++) wc[i] = 0;
38 for(i = 0; i <= n; i++) wc[x[i] = r[i]]++;
39 for(i = 1; i < m; i++) wc[i] += wc[i-1];
40 for(i = n; i >= 0; i--) sa[--wc[x[i]]] = i;
41 for(j = 1, p = 1; p < n; j *= 2, m = p) {
42 for(p = 0, i = n - j + 1; i <= n; i++) y[p++] = i;
43 for(i = 0; i <= n; i++) if(sa[i] >= j) y[p++] = sa[i] - j;
44 for(i = 0; i <= n; i++) wv[i] = x[y[i]];
45 for(i = 0; i < m; i++) wc[i] = 0;
46 for(i = 0; i <= n; i++) wc[wv[i]]++;
47 for(i = 1; i < m; i++) wc[i] += wc[i-1];
48 for(i = n; i >= 0; i--) sa[--wc[wv[i]]] = y[i];
49 for(t = x, x = y, y = t, p = 1, x[sa[0]] = 0, i = 1; i <= n; i++)
50 x[sa[i]] = cmp(y, sa[i-1], sa[i], j) ? p - 1 : p++;
51 }
52 }
53
54 void calheight() {
55 int i, j, k = 0;
56 for(i = 1; i <= n; i++) rank[sa[i]] = i;
57 for(i = 0; i < n; height[rank[i++]] = k)
58 for(k ? k-- : 0, j = sa[rank[i]-1]; r[i+k] == r[j+k]; k++);
59 }
60
61 bool check(int mid) {
62 int minn = sa[1], maxx = sa[1];
63 for(int i = 2; i <= n; i++) {
64 if(height[i] >= mid) {
65 minn = min(minn, sa[i]);
66 maxx = max(maxx, sa[i]);
67 if(maxx - minn >= mid) return 1;
68 } else minn = maxx = sa[i];
69 }
70 return false;
71 }
72
73 void solve() {
74 da();//姹俿a鏁扮粍
75 calheight();//姹俽ank鏁扮粍鍜宧eight鏁扮粍
76 int l = 1, r = n, ans = -1;
77 while(l <= r) {
78 int mid = (l + r) >> 1;
79 if(check(mid)) ans = mid, l = mid + 1;
80 else r = mid - 1;
81 }
82 if(ans >= 4) printf("%d\n", ans + 1);
83 else printf("0\n");
84 }
85
86 int main() {
87 int a, b;
88 while(~scanf("%d", &n)) {
89 if(!n) break;
90 n--;
91 scanf("%d", &b);
92 for(int i = 0; i < n; i++) {
93 scanf("%d", &a);
94 r[i] = a - b + 100;
95 b = a;
96 }
97 r[n] = 0;
98 solve();
99 }
100 return 0;
101 }
102
銆愰瑙c戯細(xì)kmp錛屾眰鍑哄師涓茬殑next[]銆?br /> 濡傛灉len % (len - next[len]) == 0錛岃鏄庡師涓叉槸鐢變竴涓瓙涓茶繛緇嫾鎺ヨ屾垚鐨勶紝涓旈噸澶嶅瓙涓茬殑闀垮害涓?(len / (len - next[len]));
銆愪唬鐮併戯細(xì)
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 #include "cmath"
8 #include "string"
9 #include "cctype"
10 #include "map"
11 #include "iomanip"
12 using namespace std;
13 #define pb push_back
14 #define lc(x) (x << 1)
15 #define rc(x) (x << 1 | 1)
16 #define lowbit(x) (x & (-x))
17 #define ll long long
18 #define maxn 1000050
19 char s[maxn];
20 int next[maxn];
21 void getnext() {
22 int i = 0, j = -1;
23 next[i] = j;
24 int len = strlen(s);
25 while(i < len) {
26 if(j == -1 || s[i] == s[j]) i++, j++, next[i] = j;
27 else j = next[j];
28 }
29 }
30
31 int main() {
32 while(~scanf("%s", s)) {
33 if(strcmp(s, ".") == 0) break;
34 getnext();
35 int len = strlen(s);
36 if(len % (len - next[len]) == 0) printf("%d\n", len / (len - next[len]));
37 else printf("1\n");
38 }
39 return 0;
40 }
41
銆愰瑙c戯細(xì)kmp鍗沖彲銆?br /> 鎴戝埄鐢ㄤ簡鍚庣紑鏁扮粍鐨勬濇兂錛屾瀯閫犳柊涓睞 + '$' + B錛岀劧鍚庡鏂頒覆姹俷ext[]鍗沖彲錛屽叿浣撶湅浠g爜銆?br />
銆愪唬鐮併戯細(xì)
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 #include "cmath"
8 #include "string"
9 #include "cctype"
10 #include "map"
11 #include "iomanip"
12 using namespace std;
13 #define pb push_back
14 #define lc(x) (x << 1)
15 #define rc(x) (x << 1 | 1)
16 #define lowbit(x) (x & (-x))
17 #define ll long long
18 #define maxn 1050000
19 char s[maxn];
20 int slen, len;
21 int next[maxn];
22 int getnext() {
23 int i = 1, j = 0, cnt = 0;
24 next[1] = 0;
25 while(i <= len) {
26 if(j == 0 || s[i] == s[j]) {
27 i++, j++, next[i] = j;
28 if(next[i] == slen + 1) cnt++;
29 } else j = next[j];
30 }
31 return cnt;
32 }
33
34 int main() {
35 int T;
36 scanf("%d", &T);
37 while(T--) {
38 scanf("%s", s + 1);
39 slen = strlen(s + 1);
40 s[slen+1] = '$';
41 scanf("%s", s + slen + 2);
42 len = strlen(s + 1);
43 printf("%d\n", getnext());
44 }
45 return 0;
46 }
47
銆愰瑙c戯細(xì)鐢╝c鑷姩鏈烘瀯閫犱竴涓狣FA錛堟棦鏈夌‘瀹氭х殑鐘舵佽漿縐誨浘錛夛紝鐒跺悗鐢ㄧ煩闃靛揩閫熷箓姹傝В銆?br />
銆愪唬鐮併戯細(xì)
2 #include "cstdio"
3 #include "cstring"
4 using namespace std;
5 #define ll long long
6 const ll MOD = 100000;
7 const int kind = 4;
8 const int maxn = 500;
9 #define MAX 105
10 int root, tot;
11 int n, m;
12 int que[maxn], head, tail;
13 bool visit[maxn];
14 struct Node {
15 int child[kind];
16 int fail;
17 int end;
18 void init() {
19 memset(child, 0, sizeof(child));
20 fail = -1, end = 0;
21 }
22 } T[maxn];
23
24 void init() {
25 root = tot = 0;
26 T[root].init();
27 }
28
29 int hash(char ch) {
30 if(ch == 'A') return 0;
31 else if(ch == 'C') return 1;
32 else if(ch == 'G') return 2;
33 else return 3;
34 }
35
36 void insert(char *s) {//鎻掑叆鍗曡瘝
37 int p = root, index;
38 while (*s) {
39 index = hash(*s);
40 if (!T[p].child[index]) {
41 T[++tot].init();
42 T[p].child[index] = tot;
43 }
44 p = T[p].child[index];
45 s++;
46 }
47 T[p].end = 1;
48 }
49
50 void build_ac_auto() {
51 head = tail = 0;
52 que[tail++] = root;
53 while (head < tail) {
54 int u = que[head++];
55 for (int i = 0; i < kind; i++) {
56 if (T[u].child[i]) {
57 int son = T[u].child[i];
58 int p = T[u].fail;
59 if (u == root) T[son].fail = root;
60 else {
61 T[son].fail = T[p].child[i];
62 T[son].end |= T[T[son].fail].end;
63 }
64 que[tail++] = son;
65 } else {//trie鍥撅紝璁懼畾铏氭嫙鑺傜偣
66 int p = T[u].fail;
67 if (u == root) T[u].child[i] = root;
68 else T[u].child[i] = T[p].child[i];
69 }
70 }
71 }
72 }
73
74 struct Mat {
75 ll val[MAX][MAX];
76 void unit() {
77 zero();
78 for(int i = 0; i < MAX; i++) val[i][i] = 1;
79 }
80 void zero() {
81 memset(val, 0, sizeof(val));
82 }
83 }x;
84
85 Mat operator *(const Mat &a, const Mat &b) {
86 Mat tmp;
87 tmp.zero();
88 for(int k = 0; k <= tot; k++) {
89 for(int i = 0; i <= tot; i++) {
90 if(a.val[i][k])
91 for(int j = 0; j <= tot; j++) {
92 tmp.val[i][j] += a.val[i][k] * b.val[k][j];
93 if(tmp.val[i][j] >= MOD) tmp.val[i][j] %= MOD;
94 }
95 }
96 }
97 return tmp;
98 }
99
100 Mat operator ^(Mat x, int n) {
101 Mat tmp;
102 tmp.unit();
103 while(n) {
104 if(n & 1) tmp = tmp * x;
105 x = x * x;
106 n >>= 1;
107 }
108 return tmp;
109 }
110
111 void dfs(int u) {
112 visit[u] = true;
113 for(int i = 0; i < kind; i++) {
114 int v = T[u].child[i];
115 if(!T[v].end) {
116 x.val[u][v]++;
117 if(!visit[v]) dfs(v);
118 }
119 }
120 }
121
122 int main() {
123 char s[15];
124 while(~scanf("%d%d", &m, &n)) {
125 init();
126 for(int i = 0; i < m; i++) {
127 scanf("%s", s);
128 insert(s);
129 }
130 build_ac_auto();
131 x.zero();
132 memset(visit, false, sizeof(visit));
133 dfs(root);
134 Mat ans = x ^ n;
135 ll res = 0;
136 for(int i = 0; i <= tot; i++)
137 res += ans.val[0][i];
138 printf("%lld\n", res % MOD);
139 }
140 return 0;
141 }
銆愰瑙c戯細(xì)鑰冭檻鍒版渶澶氬彧鏈?0涓熀鍥犱覆錛屾垜浠彲浠ヤ嬌鐢ㄧ姸鎬佸帇緙┿傚浜庝覆涔嬮棿鐨勫叧緋伙紝鎴戜滑鍙互寤虹珛瀵瑰簲鐨刟c鑷姩鏈猴紝鐒跺悗鍦╝c鑷姩鏈轟笂榪涜鐘舵佸帇緙ヾp鍗沖彲銆?br /> dp[i][j][k] i琛ㄧず闀垮害錛宩琛ㄧず鍩哄洜緇撳熬鐘舵侊紝k琛ㄧず鎵鍚熀鍥犵殑鐘舵?br /> 杞Щ鏂圭▼錛岃son涓簀鐨勫瀛愯妭鐐?
if(dp[i][j][k]) dp[i+1][son][k|T[son].id] = true;
瀹炵幇鐨勬椂鍊欐垜鐢ㄤ簡婊氬姩鏁扮粍鍘嬬緝絀洪棿錛屽叿浣撴搷浣滆鐪嬩唬鐮併?br />
銆愪唬鐮併戯細(xì)
2 #include "cstdio"
3 #include "cstring"
4 using namespace std;
5 const int kind = 4;
6 const int maxn = 250;
7 int score[15];
8 int root, tot;
9 char ch[25];
10 int n, m, l;
11 int que[maxn], head, tail;
12
13 struct Node {
14 int child[kind];
15 int fail;
16 int id;
17 void init() {
18 memset(child, 0, sizeof (child));
19 fail = -1, id = 0;
20 }
21 } T[maxn];
22
23 void init() {
24 root = tot = 0;
25 T[root].init();
26 }
27
28 int hash(char ch) {
29 if(ch == 'A') return 0;
30 else if(ch == 'C') return 1;
31 else if(ch == 'G') return 2;
32 else return 3;
33 }
34
35 void insert(char *s, int id) {//鎻掑叆鍗曡瘝
36 int p = root, index;
37 while (*s) {
38 index = hash(*s);
39 if (!T[p].child[index]) {
40 T[++tot].init();
41 T[p].child[index] = tot;
42 }
43 p = T[p].child[index];
44 s++;
45 }
46 T[p].id |= 1 << id;
47 }
48
49 void build_ac_auto() {
50 head = tail = 0;
51 que[tail++] = root;
52 while (head < tail) {
53 int u = que[head++];
54 for (int i = 0; i < kind; i++) {
55 if (T[u].child[i]) {
56 int son = T[u].child[i];
57 int p = T[u].fail;
58 if (u == root) T[son].fail = root;
59 else {
60 T[son].fail = T[p].child[i];
61 T[son].id |= T[T[son].fail].id;
62 }
63 que[tail++] = son;
64 } else {//trie鍥撅紝璁懼畾铏氭嫙鑺傜偣
65 int p = T[u].fail;
66 if (u == root) T[u].child[i] = root;
67 else T[u].child[i] = T[p].child[i];
68 }
69 }
70 }
71 }
72 bool dp[2][205][1<<10];//婊氬姩鏁扮粍,涓嶇敤婊氬姩涔熷彲浠?/span>
73 void solve() {
74 int mask = 1 << n, now, next;
75 memset(dp, false, sizeof(dp));
76 dp[0][0][0] = true;
77 for(int i = 0; i < l; i++) {
78 now = i % 2;
79 next = (i + 1) % 2;
80 memset(dp[next], false, sizeof(dp[next]));
81 for(int j = 0; j <= tot; j++) {
82 for(int k = 0; k < mask; k++) {
83 if(dp[now][j][k]) {
84 for(int p = 0; p < kind; p++) {
85 int son = T[j].child[p];
86 dp[next][son][k|T[son].id] = true;
87 }
88 }
89 }
90 }
91 }
92 int ans = -(1 << 30);
93 now = l % 2;
94 for(int i = 0; i <= tot; i++) {
95 for(int j = 0; j < mask; j++) {
96 if(dp[now][i][j]) {
97 int t = 0;
98 for(int k = 0; k < n; k++) {
99 if(j & (1<< k)) t += score[k];
100 }
101 ans = max(ans, t);
102 }
103 }
104 }
105 if(ans < 0) printf("No Rabbit after 2012!\n");
106 else printf("%d\n", ans);
107 }
108
109 int main() {
110 while(~scanf("%d%d", &n, &l)) {
111 init();
112 for(int i = 0; i < n; i++) {
113 scanf("%s%d", ch, &score[i]);
114 insert(ch, i);
115 }
116 build_ac_auto();
117 solve();
118 }
119 return 0;
120 }
銆愰瑙c戯細(xì)AC鑷姩鏈烘ā鏉塊銆?br />
銆愪唬鐮併戯細(xì)
2 #include "cstdio"
3 #include "cstring"
4 using namespace std;
5 #define maxn 700050
6 const int kind = 26;
7 int root, tot;
8 int que[maxn], head, tail;
9 int n, m;
10 char t[1005000];
11
12 struct Node {
13 int child[kind], fail, cnt;
14 void init() {
15 memset(child, 0, sizeof (child));
16 fail = -1, cnt = 0;
17 }
18 }T[maxn];
19
20 void init() {
21 root = tot = 0;
22 T[root].init();
23 }
24
25 void insert(char *s) {//鎻掑叆鍗曡瘝
26 int p = root, index;
27 while (*s) {
28 index = *s - 'a';
29 if (!T[p].child[index]) {
30 T[++tot].init();
31 T[p].child[index] = tot;
32 }
33 p = T[p].child[index];
34 s++;
35 }
36 T[p].cnt++;
37 }
38
39 void build_ac_auto() {
40 head = tail = 0;
41 que[tail++] = root;
42 while (head < tail) {
43 int u = que[head++];
44 for (int i = 0; i < kind; i++) {
45 if (T[u].child[i]) {
46 int son = T[u].child[i];
47 int p = T[u].fail;
48 if (u == root) T[son].fail = root;
49 else T[son].fail = T[p].child[i];
50 que[tail++] = son;
51 } else {//trie鍥撅紝璁懼畾铏氭嫙鑺傜偣
52 int p = T[u].fail;
53 if (u == root) T[u].child[i] = root;
54 else T[u].child[i] = T[p].child[i];
55 }
56 }
57 }
58 }
59
60 int query(char *t) {
61 int p = root, cnt = 0;
62 while(*t) {
63 int index = *t - 'a';
64 p = T[p].child[index];
65 int tmp = p;
66 while(tmp != root) {
67 cnt += T[tmp].cnt;
68 T[tmp].cnt = 0;
69 tmp = T[tmp].fail;
70 }
71 t++;
72 }
73 return cnt;
74 }
75
76 int main() {
77 int T;
78 char s[55];
79 scanf("%d", &T);
80 while(T--) {
81 scanf("%d", &n);
82 init();
83 for(int i = 0; i < n; i++) {
84 scanf("%s", s);
85 insert(s);
86 }
87 scanf("%s", t);
88 build_ac_auto();
89 int ans = query(t);
90 printf("%d\n", ans);
91 }
92 return 0;
93 }