zoukankan      html  css  js  c++  java
  • 【HDU】2825 Wireless Password

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<queue>
      4 #define MAXN 110
      5 #define MAXM 26
      6 #define MAXL (1<<10)
      7 #define MOD 20090717
      8 using namespace std;
      9 char str[MAXN];
     10 int size, digit[MAXL], dp[30][MAXN][MAXL];
     11 struct node {
     12     int fail, end, next[MAXM];
     13     void Init() {
     14         fail = end = 0;
     15         memset(next, 0, sizeof(next));
     16     }
     17 };
     18 node tree[MAXN];
     19 inline int GET(char ch) {
     20     return ch - 'a';
     21 }
     22 void Insert(char *s, int pos) {
     23     int now, t;
     24     for (now = 0; *s; s++) {
     25         t = GET(*s);
     26         if (!tree[now].next[t]) {
     27             tree[++size].Init();
     28             tree[now].next[t] = size;
     29         }
     30         now = tree[now].next[t];
     31     }
     32     tree[now].end |= (1 << pos);
     33 }
     34 void BFS() {
     35     int now, i, p;
     36     queue<int> q;
     37     q.push(0);
     38     while (!q.empty()) {
     39         now = q.front();
     40         q.pop();
     41         for (i = 0; i < MAXM; i++) {
     42             if (tree[now].next[i]) {
     43                 p = tree[now].next[i];
     44                 q.push(p);
     45                 if (now)
     46                     tree[p].fail = tree[tree[now].fail].next[i];
     47                 tree[p].end |= tree[tree[p].fail].end;
     48             } else
     49                 tree[now].next[i] = tree[tree[now].fail].next[i];
     50         }
     51     }
     52 }
     53 void Init() {
     54     int i, k;
     55     for (i = 0; i < MAXL; i++) {
     56         digit[i] = 0;
     57         for (k = i; k; k >>= 1) {
     58             if (k & 1)
     59                 digit[i]++;
     60         }
     61     }
     62 }
     63 void DoIt(int n, int m, int t) {
     64     int i, j, k, l, p, ans;
     65     for (i = 1; i <= n; i++) {
     66         for (j = 0; j <= size; j++)
     67             memset(dp[i][j], 0, sizeof(int) * (1 << m));
     68     }
     69     dp[0][0][0] = 1;
     70     for (i = 1; i <= n; i++) {
     71         for (j = 0; j <= size; j++) {
     72             for (k = 0; k < (1 << m); k++) {
     73                 if (dp[i - 1][j][k] && (tree[j].end & k) == tree[j].end) {
     74                     for (l = 0; l < MAXM; l++) {
     75                         p = tree[j].next[l];
     76                         dp[i][p][k | tree[p].end] += dp[i - 1][j][k];
     77                         if (dp[i][p][k | tree[p].end] >= MOD)
     78                             dp[i][p][k | tree[p].end] %= MOD;
     79                     }
     80                 }
     81             }
     82         }
     83     }
     84     for (j = ans = 0; j <= size; j++) {
     85         for (k = 0; k < (1 << m); k++) {
     86             if (digit[k] >= t) {
     87                 ans += dp[n][j][k];
     88                 if (ans >= MOD)
     89                     ans %= MOD;
     90             }
     91         }
     92     }
     93     printf("%d\n", ans);
     94 }
     95 int main() {
     96     int n, m, k, i;
     97     Init();
     98     while (scanf("%d%d%d", &n, &m, &k), n) {
     99         tree[0].Init();
    100         for (size = i = 0; i < m; i++) {
    101             scanf(" %s", str);
    102             Insert(str, i);
    103         }
    104         BFS();
    105         DoIt(n, m, k);
    106     }
    107     return 0;
    108 }
  • 相关阅读:
    Lifegame第一阶段任务
    软件工程 第一次实验 Git代码版本管理
    个人作业——软件工程实践总结&个人技术博客
    个人技术总结-Android hellocharts折线图
    结对第二次作业——某次疫情统计可视化的实现
    软工实践寒假作业(2/2)
    软工实践寒假作业(1/2)
    第六次作业
    第五次作业
    第四次作业
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2622736.html
Copyright © 2011-2022 走看看