Censored! POJ - 1625
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相关推荐
- Censored! POJ - 1625 AC自动机+大数DP
题意: 给出一n种字符的字典,有p个禁用的单词, 问能组成多少个不同的长度为m的合法字符串.(m<=50) 题解: 是不是个我们之前做的题目非常非常像,题意都一样. 直接将上次写的AC自动机+矩 ...
- Censored! POJ - 1625(AC自动机 + dp +高精度模板)
题目链接 题目大意:给你一个字母表,给定一些敏感字符串,问长度为m且不含任意敏感字符串的串有多少个.(字符全部来自字母表) 思路:首先第一个坑点是输入的字符是unsigned char,可能出现负的A ...
- [POJ 1625] Censored! (AC自动机+DP+高精度)
链接 POJ 1625 题意 给出P个模式串,问长度为M且不含有P中任何一个为子串的字符串有多少种. 给出了大小为N的一个字符集,属于ASCII但不一定为英文字母. 最终答案不进行取模,所以可能非常大 ...
- POJ - 1625 Censored!
希望自己能成为日更博主 题目连接:http://poj.org/problem?id=1625 题目大意:给你n个字母,再给你p个字符串,问有多少个长度为m的只由给出的n个字母构成的字符串,且字符串 ...
- POJ 1625 Censored ( Trie图 DP 高精度 )
题意 : 给出 n 个单词组成的字符集 以及 p 个非法串,问你用字符集里面的单词构造长度为 m 的单词的方案数有多少种? 分析 : 与 POJ 2778 非常相似的一道题目,如果没有做过就尝试去了解 ...
- POJ 1625 Censored! (AC自己主动机 + 高精度 + DP)
题目链接:Censored! 解析:AC自己主动机 + 高精度 + 简单DP. 字符有可能会超过128.用map映射一下就可以. 中间的数太大.得上高精度. 用矩阵高速幂会超时,简单的DP就能解决时间 ...
- POJ 1625 Censored! (AC自动机 + 高精度 + DP)
题目链接:Censored! 解析:AC自动机 + 高精度 + 简单DP. 字符有可能会超过128,用map映射一下即可. 中间的数太大,得上高精度. 用矩阵快速幂会超时,简单的DP就能解决时间的问题 ...
- POJ 1625 Censored!
给定p个模式串,求长度为m<=50的串中不包含任何模式串的串的种类数,字符仅由给出的n个字符构成,用mp数组标记下.然后和之前的几道类似,利用end和next数组得到转态转移数组,然后由于题目数 ...
- POJ - 1625 Censored!(AC自动机+dp+高精度运算)
题目链接:点击查看 题目大意:给出一个含有 n 个不同字符的字符集,接着规定所有单词的长度为 m ,再给出 k 个病毒串,问有多少个字符串中不含有病毒串 题目分析:这个题目和之前做过的DNA的那个题有 ...
最新文章
- 某国家正在测试“关闭互联网”方法
- [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)
- 【 Laravel 】日 常 整 理 记 录 分 享
- Node的Web应用框架Express的简介与搭建HelloWorld
- 简单计算器(信息学奥赛一本通-T1057)
- android 开启dlna音乐服务_新品丨数字流媒体新宠——Stack Audio Link USB音乐播放器...
- 95-136-043-源码-Operator-CoProcessOperator
- 伪标记是一种简单的半监督学习方法
- RMAN备份与恢复资料
- 求1000以内的素数c语言程序设计,C语言程序设计报告 C 实验名称 计算并输出1000以内最大的10个素数以及它们的和.doc...
- Windows Azure Cloud Service (25) 使用Startup注册COM组件(下)
- MySQL时间分区案例
- 【目标跟踪系列】SiamRpn卷积流程以及代码
- 如何linux删除文件夹,Linux系统下如何删除文件夹
- (Nips-2015)空间变换器网络
- 大学计算机专业吐槽,大学专业吐槽集锦:分分钟让你感觉“前途无亮”!
- 【企业微信实现免密登录以及发送消息(企业内部应用)】
- 【银河麒麟V10U盘只读解决方案】
- POP3协议,SMPT协议,IAMP协议介绍:
- mysql介绍(myisam)