POJ 1625 Censored!(大数+DP)

题目链接

这题,真心木啥意思,就是数据里貌似字符有负数,注意gets读入。。

  1 #include <iostream>

  2 #include <cstring>

  3 #include <cstdio>

  4 #include <queue>

  5 #include <algorithm>

  6 #include <cstdlib>

  7 using namespace std;

  8 int trie[201][50];

  9 int dp[51][201][201];

 10 int o[301];

 11 int que[201];

 12 int fail[201];

 13 int id[1001];

 14 int t,N;

 15 void CL()

 16 {

 17     t = 1;

 18     memset(trie,-1,sizeof(trie));

 19     memset(dp,0,sizeof(dp));

 20     memset(o,0,sizeof(o));

 21     memset(id,0,sizeof(id));

 22 }

 23 void insert(char *str)

 24 {

 25     int len,i,root;

 26     len = strlen(str);

 27     root = 0;

 28     for(i = 0;i < len;i ++)

 29     {

 30         if(trie[root][id[str[i]+200]] == -1)

 31         trie[root][id[str[i]+200]] = t ++;

 32         root = trie[root][id[str[i]+200]];

 33     }

 34     o[root] = 1;

 35 }

 36 void build_ac()

 37 {

 38     int front,tail,head,i;

 39     head = tail = 0;

 40     for(i = 0;i < N;i ++)

 41     {

 42         if(trie[0][i] != -1)

 43         {

 44             fail[trie[0][i]] = 0;

 45             que[tail++] = trie[0][i];

 46         }

 47         else

 48         {

 49             trie[0][i] = 0;

 50         }

 51     }

 52     while(head != tail)

 53     {

 54         front = que[head++];

 55         if(o[fail[front]])

 56         o[front] = 1;

 57         for(i = 0;i < N;i ++)

 58         {

 59             if(trie[front][i] != -1)

 60             {

 61                 que[tail++] = trie[front][i];

 62                 fail[trie[front][i]] = trie[fail[front]][i];

 63             }

 64             else

 65             {

 66                 trie[front][i] = trie[fail[front]][i];

 67             }

 68         }

 69     }

 70 }

 71 int main()

 72 {

 73     int M,P,i,j,k,u;

 74     int ans[201];

 75     char ch[51];

 76     while(scanf("%d%d%d%*c",&N,&M,&P)!=EOF)

 77     {

 78         CL();

 79         gets(ch);

 80         for(i = 0;i < N;i ++)

 81         {

 82             id[ch[i]+200] = i;

 83         }

 84         for(i = 0;i < P;i ++)

 85         {

 86             gets(ch);

 87             insert(ch);

 88         }

 89         build_ac();

 90         dp[0][0][0] = 1;

 91         for(i = 0;i < M;i ++)

 92         {

 93             for(j = 0;j < t;j ++)

 94             {

 95                 if(o[j]) continue;

 96                 for(k = 0;k < N;k ++)

 97                 {

 98                     if(o[trie[j][k]]) continue;

 99                     for(u = 0;u < 200;u ++)

100                     {

101                         dp[i+1][trie[j][k]][u] += dp[i][j][u];

102                     }

103                     for(u = 0;u < 200;u ++)

104                     {

105                         if(dp[i+1][trie[j][k]][u] > 9)

106                         {

107                             dp[i+1][trie[j][k]][u+1] += dp[i+1][trie[j][k]][u]/10;

108                             dp[i+1][trie[j][k]][u] = dp[i+1][trie[j][k]][u]%10;

109                         }

110                     }

111                 }

112             }

113         }

114         memset(ans,0,sizeof(ans));

115         for(i = 0;i < t;i ++)

116         {

117             for(u = 0;u < 200;u ++)

118             {

119                 ans[u] += dp[M][i][u];

120             }

121             for(u = 0;u < 200;u ++)

122             {

123                 if(ans[u] > 9)

124                 {

125                     ans[u+1] += ans[u]/10;

126                     ans[u] = ans[u]%10;

127                 }

128             }

129         }

130         int flag = 0;

131         for(i = 200;i >= 0;i --)

132         {

133             if(ans[i] > 0)

134             flag = 1;

135             if(flag)

136             printf("%d",ans[i]);

137         }

138         if(flag == 0)

139         printf("0\n");

140         else

141         printf("\n");

142     }

143     return 0;

144 }

 

你可能感兴趣的:(poj)