zoukankan      html  css  js  c++  java
  • [HDOJ2825]Wireless Password

    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 }
  • 相关阅读:
    七、Struts2之文件上传与下载
    八、Struts2之OGNL
    五、Struts2之类型转换
    wpf坐标转换相关
    wpf拖拽封装类
    获取Bitmap的Graphics
    Win32定时器
    vs2010调试dll
    使用GDI+ 保存HDC为位图文件
    在c++中使用.net
  • 原文地址:https://www.cnblogs.com/debugcool/p/HDOJ2825.html
Copyright © 2011-2022 走看看