现在的位置: 首页 > 综合 > 正文

[HDOJ2825]Wireless Password

2013年03月02日 ⁄ 综合 ⁄ 共 2008字 ⁄ 字号 评论关闭

Trie图(AC自动机)+dp,另外,这题卡常数~

View Code

1 #include <cstdio>
2 #include <cstring>
3
4 usingnamespace std;
5
6 constint NS =26;
7 constint MAXL =16;
8 constint MAXN =128;
9 constint MOD =20090717;
10
11 constint bits[] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5};
12
13 int N;
14 int M;
15 int K;
16
17 int node;
18 int tag[MAXN];
19 int suffix[MAXN];
20 int next[MAXN][NS];
21
22 int queue[MAXN];
23
24 int dp[NS][MAXN][1<<10];
25
26 int bitCount(int k)
27 {
28 return bits[k &31] + bits[(k >>5) &31];
29 }
30
31 int TrieInit()
32 {
33 node =0;
34 memset(tag,0,sizeof(tag));
35 memset(suffix,-1,sizeof(suffix));
36 memset(next,-1,sizeof(next));
37 return node++;
38 }
39
40 void TrieInsert(char* word,int id,int root)
41 {
42 char* key;
43 int tmp;
44
45 key = word;
46 tmp = root;
47
48 while (*key)
49 {
50 int idx = (*key++) -'a';
51 if (next[tmp][idx] ==-1)
52 next[tmp][idx] = node++;
53 tmp = next[tmp][idx];
54 }
55 tag[tmp] = (1<< id);
56 }
57
58 void getSuffix(int root)
59 {
60 int qh =-1;
61 int qe =0;
62
63 queue[0] = root;
64
65 while (qh != qe)
66 {
67 qh++;
68
69 int tmp = queue[qh];
70 for (int i =0;i < NS;i++)
71 if (next[tmp][i] !=-1)
72 {
73 int now = next[tmp][i];
74 int p = suffix[tmp];
75 while (p !=-1&& next[p][i] ==-1) p = suffix[p];
76 if (p ==-1) suffix[now] = root;
77 else
78 {
79 suffix[now] = next[p][i];
80 tag[now] |= tag[next[p][i]];
81 }
82 queue[++qe] = now;
83 }
84 else
85 {
86 int p = suffix[tmp];
87 while (p !=-1&& next[p][i] ==-1) p = suffix[p];
88 if (p ==-1) next[tmp][i] = root;
89 else next[tmp][i] = next[p][i];
90 }
91 }
92 }
93
94 int main()
95 {
96 char word[MAXL];
97 while (scanf("%d %d %d",&N,&M,&K) != EOF)
98 {
99 if (N ==0&& M ==0&& K ==0)
100 break;
101
102 int root = TrieInit();
103 for (int i =0;i < M;i++)
104 {
105 scanf("%s",word);
106 TrieInsert(word,i,root);
107 }
108 getSuffix(root);
109
110 memset(dp,0,sizeof(dp));
111
112 dp[0][0][0] =1;
113
114 for (int i =1;i <= N;i++)
115 for (int j =0;j < node;j++)
116 for (int k =0;k <1<< M;k++)
117 {
118 if(dp[i-1][j][k] ==0) continue; // without this TLE
119 for (int l =0;l < NS;l++)
120 {
121 dp[i][next[j][l]][k|tag[next[j][l]]] += dp[i-1][j][k];
122 dp[i][next[j][l]][k|tag[next[j][l]]] %= MOD;
123 }
124 }
125 int ans =0;
126 for (int i =0;i <1<< M;i++)
127 if (bitCount(i) >= K)
128 for (int j =0;j < node;j++)
129 {
130 ans += dp[N][j][i];
131 ans %= MOD;
132 }
133 printf("%d\n",ans);
134 }
135 return0;
136 }

抱歉!评论已关闭.