Wireless Password - HDU 2825(ac自动机+状态压缩)
- #include<iostream>
- #include<algorithm>
- #include<stdio.h>
- #include<string.h>
- #include<queue>
- using namespace std;
- const int MAXN = ;
- const int MaxSon = ;
- const int Mod = ;
- const int oo = 1e9+;
- struct Ac_Trie
- {
- int next[MAXN][MaxSon];
- int Fail[MAXN], End[MAXN];
- int cnt, root;
- int newnode()
- {
- for(int i=; i<MaxSon; i++)
- next[cnt][i] = -;
- Fail[cnt] = End[cnt] = false;
- return cnt++;
- }
- void InIt()
- {
- cnt = ;
- root = newnode();
- }
- void Insert(char s[], int t)
- {
- int now = root;
- for(int i=; s[i]; i++)
- {
- int k = s[i]-'a';
- if(next[now][k] == -)
- next[now][k] = newnode();
- now = next[now][k];
- }
- End[now] = <<t;
- }
- void GetFial()
- {
- queue<int>Q;
- int now = root;
- for(int i=; i<MaxSon; i++)
- {
- if(next[now][i] == -)
- next[now][i] = root;
- else
- {
- Fail[next[now][i]] = root;
- Q.push(next[now][i]);
- }
- }
- while(Q.size())
- {
- now = Q.front();
- Q.pop();
- for(int i=; i<MaxSon; i++)
- {
- if(next[now][i] == -)
- next[now][i] = next[Fail[now]][i];
- else
- {
- Fail[next[now][i]] = next[Fail[now]][i];
- Q.push(next[now][i]);
- }
- }
- End[now] |= End[Fail[now]];
- }
- }
- };
- Ac_Trie ac;
- int Find(int i)
- {
- int k=;
- while(i)
- {
- if(i % )
- k++;
- i /= ;
- }
- return k;
- }
- int main()
- {
- int N, M, K;
- int sum[] ={};
- for(int i=; i<; i++)
- sum[i] = Find(i);
- while(scanf("%d%d%d", &N, &M, &K), N+M+K)
- {
- char s[MAXN];
- ac.InIt();
- for(int i=; i<M; i++)
- {
- scanf("%s", s);
- ac.Insert(s, i);
- }
- ac.GetFial();
- int dp[][MAXN][] = {}, op=, Len = <<M;
- dp[][][] = ;
- while(N--)
- {
- memset(dp[op], , sizeof(dp[op]));
- for(int i=; i<ac.cnt; i++)
- for(int k=; k<Len; k++)
- {///把k放中间优化一下...否则超时
- if(dp[op^][i][k] == )
- continue;
- for(int j=; j<MaxSon; j++)
- {
- (dp[op][ac.next[i][j]][k|ac.End[i]] += dp[op^][i][k])%=Mod;
- }
- }
- op ^= ;
- }
- int ans = ;
- for(int i=; i<ac.cnt; i++)
- for(int j=; j<Len; j++)
- {
- if(sum[j] >= K || sum[ac.End[i]|j] >= K)
- {
- ans += dp[op^][i][j];
- ans %= Mod;
- }
- }
- printf("%d\n", ans);
- }
- return ;
- }
Wireless Password - HDU 2825(ac自动机+状态压缩)的更多相关文章
- hdu 2825(ac自动机+状态压缩dp)
题意:容易理解... 分析:在做这道题之前我做了hdu 4057,都是同一种类型的题,因为题中给的模式串的个数最多只能为10个,所以我们就很容易想到用状态压缩来做,但是开始的时候我的代码超时了dp时我 ...
- HDU 4511 (AC自动机+状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...
- hdu 4057(ac自动机+状态压缩dp)
题意:容易理解... 分析:题目中给的模式串的个数最多为10个,于是想到用状态压缩dp来做,它的状态范围为1-2^9,所以最大为2^10-1,那我们可以用:dp[i][j][k]表示长度为i,在tri ...
- hdu 3341(ac自动机+状态压缩)
题意:容易理解... 思路:首先一开始容易想到要用到dp,开设一个dp[41][41][41][41][501]的数组来解决,但是明显内存已经超出范围了,于是就想如何减少内存呢?只要知道A.T.C.G ...
- hdu 2825 aC自动机+状压dp
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU 4057 Rescue the Rabbit ( AC自动机 + 状态压缩DP )
模板来自notonlysuccess. 模式串只有10个,并且重复出现的分值不累加,因此很容易想到状态压缩. 将模式串加入AC自动机,最多有10*100个状态. dp[i][j][k]:串长为i,在T ...
- HDU 4758 Walk Through Squares( AC自动机 + 状态压缩DP )
题意:给你两个串A,B, 问一个串长为M+N且包含A和B且恰好包含M个R的字符串有多少种组合方式,所有字符串中均只含有字符L和R. dp[i][j][k][S]表示串长为i,有j个R,在自动机中的状态 ...
- POJ 3691 (AC自动机+状态压缩DP)
题目链接: http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...
- bzoj1195 神奇的ac自动机+状态压缩dp
/* 难的不是ac自动机,是状态压缩dp 之前做了一两题类似题目,感觉理解的还不够透彻 */ #include<iostream> #include<cstdio> #incl ...
随机推荐
- static 方法.
If a subclass defines a static method with the same signature as a static method in the superclass, ...
- 利用html+ashx实现aspx的功能
最近准备学习下ASP.NET,初期在网上看了些视频教程,准备将自己学习的东西整理整理,留着日后可以参考参考. 本文采用了html.ashx实现aspx,实现了一个最简单的动态网页效果,开发环境是VS2 ...
- Oracle-在线重定义操作文档
Oracle-在线重定义操作文档 2015年10月8日 15:51 在线重定义的大致操作流程如下: (1)创建基础表A,如果存在,就不需要操作. (2)创建临时的分区表B. (3)开始重定义,将基表A ...
- 玩转CSLA.NET小技巧系列二:使用WCF无法上传附件,提示413 Entity Too Large
背景:由于系统需要展示图片,客户上传图片到本地客户端目录,然后在数据库中存储本地图片地址,和图片二进制数据 错误原因:我是使用CSLA的WCF服务,使用了数据门户,WCF协议使用的是wsHttpBin ...
- SGU 172.eXam(二分图染色)
时间限制:0.25s 空间限制:4M 题意: 将n(n<200)个点分成两个集合,给出m(m<=30000)对不能在一个集合的点对,判断能否分成满足要求的集合,输出其中一个集合和集合的总数 ...
- 修改原代码定制bootstrap
1.下载对应的Bootstarap和node.js 注:less文件夹中包含了bootstrap中所有样式组件的less源代码: dist保存编译后的css和js等文件 2.命令行输入npm inst ...
- Invoke()/BeginInvoke()区别
查看MSDN如下: Control..::.Invoke ---> 在拥有此控件的基础窗口句柄的线程上执行委托. Control..::.BeginInvoke ---> ...
- asp.net在应用母版的页面下采用了ModalPopupExtender弹出窗中应用autocomplete
autocomplete是jqueryUI的一个插件,可以实现自动填充的功能. 要点:1.应用了母版页,所以取页面上控件的ID时与一般方法不同 2.由于用了ajax的updatepanel,所以会出现 ...
- 如何用DOS 链接mysql
1.Ctrl+R 打开DOS窗口 2.键入 cd\ 回车进入C盘根目录 3.进入mysql bin目录下 操作mysql命令 4.输入连接数据库命令 mysql -hlocalhost -uroot ...
- iOS: 获取文件路径
iOS: 获取文件路径 // 例如 - (NSString *)applicationDocumentsDirectory { return [NSSearchPathForDirectories ...