HDU2825 Wireless Password


Problem Description

Liyuan lives in a old apartment. One day, he suddenly found that there was a wireless network in the building. Liyuan did not know the password of the network, but he got some important information from his neighbor. He knew the password consists only of lowercase letters ‘a’-‘z’, and he knew the length of the password. Furthermore, he got a magic word set, and his neighbor told him that the password included at least k words of the magic word set (the k words in the password possibly overlapping).

For instance, say that you know that the password is 3 characters long, and the magic word set includes ‘she’ and ‘he’. Then the possible password is only ‘she’.

Liyuan wants to know whether the information is enough to reduce the number of possible passwords. To answer this, please help him write a program that determines the number of possible passwords.

Input

There will be several data sets. Each data set will begin with a line with three integers n m k. n is the length of the password (1<=n<=25), m is the number of the words in the magic word set(0<=m<=10), and the number k denotes that the password included at least k words of the magic set. This is followed by m lines, each containing a word of the magic set, each word consists of between 1 and 10 lowercase letters ‘a’-‘z’. End of input will be marked by a line with n=0 m=0 k=0, which should not be processed.

Output

For each test case, please output the number of possible passwords MOD 20090717.

Sample Input

10 2 2

hello

world

4 1 1

icpc

10 0 0

0 0 0

Sample Output

2

1

14195065


我觉得挺好的一道题。。一开始只知道是DP,然后写了一个循环,后面发现不能重复计算,然后改成了状压DP,改成了队列实现DP,上线是步数小于等于长度,然后每一次DP转移将步数加1就好了,然后或一下当前存在的状态。

处理fail指针的时候做两个小优化,一个是在处理的时候就把fail链上的id全部统计起来,二个是把失配后跳到的节点直接储存成儿子节点

然后注意开一下取模的操作,防止TLE


#include<bits/stdc++.h>
using namespace std;
#define N 110
#define Mod 20090717
struct Node{
int fail,id,ch[26];
void clean(){
fail=id=0;
memset(ch,0,sizeof(ch));
}
}t[N];
struct Node1{int id,tmp,now;};
int n,m,p,tot=0;
int dp[N][26][1025],c[1025];
bool vis[N][26][1025];
char s[20][N];
void init(){
tot=1;
t[0].clean();t[1].clean();
for(int i=0;i<26;i++)t[0].ch[i]=1;
memset(dp,0,sizeof(dp));
}
int index(char c){return c-'a';}
void insert(char *s,int id){
int len=strlen(s),u=1;
for(int i=0;i<len;i++){
int tmp=index(s[i]);
if(!t[u].ch[tmp])
t[t[u].ch[tmp]=++tot].clean();
u=t[u].ch[tmp];
}
t[u].id=1<<(id-1);
}
void buildFail(){
queue<int> q;q.push(1);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=0;i<26;i++){
int w=t[u].ch[i],v=t[u].fail;
while(!t[v].ch[i])v=t[v].fail;
v=t[v].ch[i];
if(w){
t[w].fail=v;
t[w].id|=t[v].id;//***
q.push(w);
}else t[u].ch[i]=v;//***
}
}
}
void solve(){
queue<Node1> qn;
qn.push((Node1){1,0,0});
dp[1][0][0]=1;
while(!qn.empty()){
Node1 u=qn.front();qn.pop();
vis[u.id][u.tmp][u.now]=0;
if(u.tmp>n)continue;
for(int i=0;i<26;i++){
int id=t[u.id].ch[i],tmp=u.tmp+1,now=u.now|t[id].id;
dp[id][tmp][now]+=dp[u.id][u.tmp][u.now];
if(dp[id][tmp][now]>Mod)dp[id][tmp][now]-=Mod;
if(!vis[id][tmp][now]){
vis[id][tmp][now]=1;
qn.push((Node1){id,tmp,now});
}
}
}
}
int count(int t){
int ans=0;
while(t){
if(t&1)ans++;
t>>=1;
}
return ans;
}
int main(){
for(int i=0;i<1024;i++)c[i]=count(i);
while(1){
scanf("%d%d%d",&n,&m,&p);
if(!n)break;
init();//初始化
for(int i=1;i<=m;i++){
scanf("%s",s[i]);
insert(s[i],i);
}
buildFail();
solve();
int ans=0,up=1<<m;
for(int i=0;i<up;i++)if(c[i]>=p)
for(int j=1;j<=tot;j++){
ans+=dp[j][n][i];
if(ans>Mod)ans-=Mod;
}
printf("%d\n",ans);
}
return 0;
}

HDU2825 Wireless Password 【AC自动机】【状压DP】的更多相关文章

  1. HDU2825 Wireless Password —— AC自动机 + 状压DP

    题目链接:https://vjudge.net/problem/HDU-2825 Wireless Password Time Limit: 2000/1000 MS (Java/Others)    ...

  2. hdu2825 Wireless Password(AC自动机+状压dp)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  3. HDU-2825 Wireless Password(AC自动机+状压DP)

    题目大意:给一系列字符串,用小写字母构造出长度为n的至少包含k个字符串的字符串,求能构造出的个数. 题目分析:在AC自动机上走n步,至少经过k个单词节点,求有多少种走法. 代码如下: # includ ...

  4. 【HDU2825】Wireless Password (AC自动机+状压DP)

    Wireless Password Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u De ...

  5. hdu_2825_Wireless Password(AC自动机+状压DP)

    题目链接:hdu_2825_Wireless Password 题意: 给你m个串,问长度为n至少含k个串的字符串有多少个 题解: 设dp[i][j][k]表示考虑到长度为i,第j个自动机的节点,含有 ...

  6. hdu 2825 aC自动机+状压dp

    Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  7. BZOJ1559 [JSOI2009]密码 【AC自动机 + 状压dp】

    题目链接 BZOJ1559 题解 考虑到这是一个包含子串的问题,而且子串非常少,我们考虑\(AC\)自动机上的状压\(dp\) 设\(f[i][j][s]\)表示长度为\(i\)的串,匹配到了\(AC ...

  8. HDU 3247 Resource Archiver(AC自动机 + 状压DP + bfs预处理)题解

    题意:目标串n( <= 10)个,病毒串m( < 1000)个,问包含所有目标串无病毒串的最小长度 思路:貌似是个简单的状压DP + AC自动机,但是发现dp[1 << n][ ...

  9. zoj3545Rescue the Rabbit (AC自动机+状压dp+滚动数组)

    Time Limit: 10 Seconds      Memory Limit: 65536 KB Dr. X is a biologist, who likes rabbits very much ...

  10. hdu 4057--Rescue the Rabbit(AC自动机+状压DP)

    题目链接 Problem Description Dr. X is a biologist, who likes rabbits very much and can do everything for ...

随机推荐

  1. hadoop安装时报错 /usr/local/hadoop-2.6.0-stable/hadoop-2.6.0-src/hadoop-hdfs-project/hadoop-hdfs/target/findbugsXml.xml does not exist

    安装时报错:Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (site) on project ...

  2. HttpServletRequest request方法详解

    //1.获取请求参数 //获取参数的单个值,如有多个则只返回第一个 String parameter1 = request.getParameter("demo"); //获取参数 ...

  3. enabled和priority属性

    本篇来继续学习@Test下的注释,这篇学习两个属性的基本使用.第一个是设置该条用例不被执行,第二个的作用是设置用例执行的优先顺序. 1. 属性enabled 在Testng中,如果方法前面添加了@Te ...

  4. webstorm拉取git代码

    在webstorm中VCS → git → clone → url就是你的git代码地址,parent Directory(你要放到的目录),Directiory Name(起一个项目名称)

  5. 常见HTTP状态(304,)

    一.1XX(临时响应) 表示临时响应并需要请求者继续执行操作的状态码. 100(继续) 请求者应当继续提出请求.服务器返回此代码表示:已经收到请求的第一部分,正在等待其余部分. 101(切换协议) 请 ...

  6. Memcached stats items 命令

    Memcached stats items 命令用于显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数). 语法: stats items 命令的基本语法格式如下: sta ...

  7. 缓存技术内部交流_02_Ehcache3 XML 配置

    参考资料: http://www.ehcache.org/documentation/3.2/getting-started.html#configuring-with-xml http://www. ...

  8. 在线前端开发平台 Plunker

    Plunker 网站 : http://plnkr.co/ Plunker 是一个用来创建.协作和分享 Web 开发思路的在线社区.编辑界面如下图所示: 特点: 基于 Node.js 环境运行 实时的 ...

  9. [Vue]vue中各选项及钩子函数执行顺序

    在vue中,实例选项和钩子函数和{{}}表达式都是不需要手动调用就可以直接执行的. 一.生命周期图示 二.vue中各选项及钩子函数执行顺序 1.在页面首次加载执行顺序有如下: beforeCreate ...

  10. 《The Cg Tutorial》阅读笔记——凹凸贴图 Bump Mapping

    本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/5018103.html 凹凸贴图 Bump Mapping 一.简介 凹凸贴图用于在不 ...