Censored!

POJ - 1625

ac自动机 + 高精度 + dp

  1 #include <iostream>
  2 #include <queue>
  3 #include <cstring>
  4 #include <cstdio>
  5 #include <algorithm>
  6 using namespace std;
  7 const int sigma = 50;
  8 const int maxnode = 110;
  9 int n, m;
 10 int dp[51][110][30];
 11
 12 struct AC{
 13     char str[sigma+10];
 14     int ch[maxnode][sigma];
 15     int f[maxnode];
 16     int mu[maxnode];
 17     int sz;
 18
 19     void init(){
 20         memset(mu, 0 , sizeof(mu));
 21         memset(ch[0], 0, sizeof(ch[0]));
 22         sz = 1;
 23     }
 24     int idx(char c){
 25         int L = 0, R = n;
 26         int mid;
 27         while(L <= R){
 28             mid = (L+R)/2;
 29             if(c > str[mid]) L = mid+1;
 30             else if(c == str[mid]) return mid;
 31             else R = mid-1;
 32         }
 33     }
 34     void insert(char *s) {
 35         int u = 0, n = strlen(s);
 36         for(int i = 0; i < n; i++) {
 37             int c = idx(s[i]);
 38             if(!ch[u][c]){
 39                 memset(ch[sz], 0, sizeof(ch[sz]));
 40                 ch[u][c] = sz++;
 41             }
 42             u = ch[u][c];
 43         }
 44         mu[u] = 1;
 45     }
 46
 47     void getfail(){
 48         queue<int> q;
 49         f[0] = 0;
 50         for(int c = 0; c < n; c++){
 51             int u = ch[0][c];
 52             if(u){
 53                 f[u] = 0;
 54                 q.push(u);
 55             }
 56         }
 57         while(!q.empty()){
 58             int r = q.front();
 59             q.pop();
 60             for(int c = 0; c < n; c++){
 61                 int u = ch[r][c];
 62                 if(!u) {
 63                     ch[r][c] = ch[f[r]][c];
 64                     continue;
 65                 }
 66                 q.push(u);
 67                 int v = f[r];
 68                 while(v && !ch[v][c]) v = f[v];
 69                 f[u] = ch[v][c];
 70                 mu[u] |= mu[f[u]];
 71             }
 72         }
 73     }
 74 }ac;
 75 void add(int *a, int *b){
 76     int c = 0;
 77     for(int i = 0; i < 30; i++){
 78         a[i] = a[i] + b[i] + c;
 79         c = a[i] / 10000;
 80         a[i] = a[i] % 10000;
 81     }
 82 }
 83
 84 void solve(){
 85     memset(dp, 0, sizeof(dp));
 86     dp[0][0][0] = 1;
 87     for(int i = 1; i <= m; i++){
 88         for(int j = 0; j < ac.sz; j++){
 89             if(ac.mu[j]) continue;
 90             for(int k = 0; k < n; k++){
 91                 int p = ac.ch[j][k];
 92                 if(ac.mu[p]) continue;
 93                 add(dp[i][p], dp[i-1][j]);
 94             }
 95         }
 96     }
 97     int ans[30];
 98     memset(ans, 0, sizeof(ans));
 99     for(int i = 0; i < ac.sz; i++){
100         if(!ac.mu[i]) add(ans, dp[m][i]);
101     }
102     int i = 29;
103     for(; i>=0; i--){
104         if(ans[i]) break;
105     }
106     if(i < 0) printf("0");
107     else {
108         printf("%d", ans[i]);
109         i--;
110         for(; i>=0; i--)printf("%04d", ans[i]);
111     }
112     puts("");
113 }
114 int main(){
115     int p;
116  //   freopen("in.txt", "r", stdin);
117     while(scanf("%d %d %d", &n, &m, &p)!=EOF){
118         ac.init();
119         scanf("%s", ac.str);
120         sort(ac.str, ac.str+strlen(ac.str));
121         for(int i = 0; i < p; i++){
122             char s[11];
123             scanf("%s", s);
124             ac.insert(s);
125         }
126         ac.getfail();
127         solve();
128     }
129     return 0;
130 }

View Code

拖了俩月的题目终于解决了...

转载于:https://www.cnblogs.com/yijiull/p/7654407.html

Censored! POJ - 1625相关推荐

  1. Censored! POJ - 1625 AC自动机+大数DP

    题意: 给出一n种字符的字典,有p个禁用的单词, 问能组成多少个不同的长度为m的合法字符串.(m<=50) 题解: 是不是个我们之前做的题目非常非常像,题意都一样. 直接将上次写的AC自动机+矩 ...

  2. Censored! POJ - 1625(AC自动机 + dp +高精度模板)

    题目链接 题目大意:给你一个字母表,给定一些敏感字符串,问长度为m且不含任意敏感字符串的串有多少个.(字符全部来自字母表) 思路:首先第一个坑点是输入的字符是unsigned char,可能出现负的A ...

  3. [POJ 1625] Censored! (AC自动机+DP+高精度)

    链接 POJ 1625 题意 给出P个模式串,问长度为M且不含有P中任何一个为子串的字符串有多少种. 给出了大小为N的一个字符集,属于ASCII但不一定为英文字母. 最终答案不进行取模,所以可能非常大 ...

  4. POJ - 1625 Censored!

    希望自己能成为日更博主 题目连接:http://poj.org/problem?id=1625  题目大意:给你n个字母,再给你p个字符串,问有多少个长度为m的只由给出的n个字母构成的字符串,且字符串 ...

  5. POJ 1625 Censored ( Trie图 DP 高精度 )

    题意 : 给出 n 个单词组成的字符集 以及 p 个非法串,问你用字符集里面的单词构造长度为 m 的单词的方案数有多少种? 分析 : 与 POJ 2778 非常相似的一道题目,如果没有做过就尝试去了解 ...

  6. POJ 1625 Censored! (AC自己主动机 + 高精度 + DP)

    题目链接:Censored! 解析:AC自己主动机 + 高精度 + 简单DP. 字符有可能会超过128.用map映射一下就可以. 中间的数太大.得上高精度. 用矩阵高速幂会超时,简单的DP就能解决时间 ...

  7. POJ 1625 Censored! (AC自动机 + 高精度 + DP)

    题目链接:Censored! 解析:AC自动机 + 高精度 + 简单DP. 字符有可能会超过128,用map映射一下即可. 中间的数太大,得上高精度. 用矩阵快速幂会超时,简单的DP就能解决时间的问题 ...

  8. POJ 1625 Censored!

    给定p个模式串,求长度为m<=50的串中不包含任何模式串的串的种类数,字符仅由给出的n个字符构成,用mp数组标记下.然后和之前的几道类似,利用end和next数组得到转态转移数组,然后由于题目数 ...

  9. POJ - 1625 Censored!(AC自动机+dp+高精度运算)

    题目链接:点击查看 题目大意:给出一个含有 n 个不同字符的字符集,接着规定所有单词的长度为 m ,再给出 k 个病毒串,问有多少个字符串中不含有病毒串 题目分析:这个题目和之前做过的DNA的那个题有 ...

最新文章

  1. 某国家正在测试“关闭互联网”方法
  2. [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)
  3. 【 Laravel 】日 常 整 理 记 录 分 享
  4. Node的Web应用框架Express的简介与搭建HelloWorld
  5. 简单计算器(信息学奥赛一本通-T1057)
  6. android 开启dlna音乐服务_新品丨数字流媒体新宠——Stack Audio Link USB音乐播放器...
  7. 95-136-043-源码-Operator-CoProcessOperator
  8. 伪标记是一种简单的半监督学习方法
  9. RMAN备份与恢复资料
  10. 求1000以内的素数c语言程序设计,C语言程序设计报告 C 实验名称 计算并输出1000以内最大的10个素数以及它们的和.doc...
  11. Windows Azure Cloud Service (25) 使用Startup注册COM组件(下)
  12. MySQL时间分区案例
  13. 【目标跟踪系列】SiamRpn卷积流程以及代码
  14. 如何linux删除文件夹,Linux系统下如何删除文件夹
  15. (Nips-2015)空间变换器网络
  16. 大学计算机专业吐槽,大学专业吐槽集锦:分分钟让你感觉“前途无亮”!
  17. 【企业微信实现免密登录以及发送消息(企业内部应用)】
  18. 【银河麒麟V10U盘只读解决方案】
  19. POP3协议,SMPT协议,IAMP协议介绍:
  20. mysql介绍(myisam)

热门文章

  1. 你能不能做老大,关键就看这8关!突破了,人人死心塌地追随你
  2. java中获取日期属于哪一年的第几周
  3. 接着奏乐接着舞 Matlab制作圣诞树和圣诞快乐歌
  4. Neo4j Server shutdown initiated by request.解决方案
  5. 面试分享:一年经验初探阿里巴巴前端社招
  6. vue 实现导出excel或文件两种方法
  7. C# 开发的网络数据包抓取的的实现
  8. 台式电脑计算机怎么看是固态硬盘,怎么看电脑是机械硬盘还是固态硬盘
  9. 人脸识别概述及基于多显卡服务器实现百万底库人脸比对的简单实现方案
  10. P5304旅行者(比bk201还要流氓的解法)