hdu 2825 Wireless Password(ac自己主动机&dp)
Wireless Password
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4022 Accepted Submission(s): 1196
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.
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.
10 2 2
hello
world
4 1 1
icpc
10 0 0
0 0 0
2
1
14195065
#include<algorithm>
#include<iostream>
#include<string.h>
#include<sstream>
#include<stdio.h>
#include<math.h>
#include<vector>
#include<string>
#include<queue>
#include<set>
#include<map>
using namespace std;
const int INF=0x3f3f3f3f;
const double eps=1e-8;
const double PI=acos(-1.0);
const int mod=20090717;
const int md=150;
const int ssz=26;
const int maxn=30;
int ch[md][ssz],val[md],f[md],last[md];
int sz,dp[maxn][md][1<<11],one[1<<11],bi[11];
int idx(char c) { return c-'a'; }
void init()
{
sz=1;
val[0]=0;
memset(ch[0],0,sizeof ch[0]);
}
void Insert(char *s,int v)
{
int u=0,n=strlen(s);
for(int i=0; i<n; i++)
{
int c=idx(s[i]);
if(!ch[u][c])
{
memset(ch[sz],0,sizeof ch[sz]);
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=v;
}
void getf()
{
queue<int> q;
int u,v,c,r;
f[0]=0;
for(c=0;c<ssz;c++)
{
u=ch[0][c];
if(u)
{
f[u]=0;
q.push(u);
last[u]=0;
}
}
while(!q.empty())
{
r=q.front();
q.pop();
val[r]|=val[f[r]];
for(c=0;c<ssz;c++)
{
u=ch[r][c];
if(!u)
{
ch[r][c]=ch[f[r]][c];
continue;
}
q.push(u);
v=f[r];
while(v&&!ch[v][c])
v=f[v];
f[u]=ch[v][c];
}
}
}
void solve(int n,int k,int ms)
{
int i,j,s,c,v,ns,ans;
getf();
for(i=0;i<=n;i++)
for(j=0;j<sz;j++)
for(s=0;s<ms;s++)
dp[i][j][s]=0;
dp[0][0][0]=1;
for(i=0;i<n;i++)
for(j=0;j<sz;j++)
for(s=0;s<ms;s++)
{
if(!dp[i][j][s])
continue;
for(c=0;c<ssz;c++)
{
v=ch[j][c],ns=s|val[v];
dp[i+1][v][ns]=(dp[i+1][v][ns]+dp[i][j][s])%mod;
}
}
ans=0;
for(s=0;s<ms;s++)
{
if(one[s]<k)
continue;
for(i=0;i<sz;i++)
ans=(ans+dp[n][i][s])%mod;
}
printf("%d\n",ans);
}
int getone(int x)
{
int c=0;
while(x)
{
c+=x&1;
x>>=1;
}
return c;
}
int main()
{
int i,n,m,k;
char magic[20]; bi[0]=1;
for(i=1;i<11;i++)
bi[i]=bi[i-1]<<1;
for(i=0;i<bi[10];i++)
one[i]=getone(i);
while(scanf("%d%d%d",&n,&m,&k),n||m||k)
{
init();
for(i=0;i<m;i++)
{
scanf("%s",magic);
Insert(magic,bi[i]);
}
solve(n,k,bi[m]);
}
return 0;
}
hdu 2825 Wireless Password(ac自己主动机&dp)的更多相关文章
- HDU 2825 Wireless Password (AC自己主动机,DP)
pid=2825">http://acm.hdu.edu.cn/showproblem.php? pid=2825 Wireless Password Time Limit: 2000 ...
- HDU - 2825 Wireless Password(AC自己主动机+DP)
Description Liyuan lives in a old apartment. One day, he suddenly found that there was a wireless ne ...
- POJ 3691 & HDU 2457 DNA repair (AC自己主动机,DP)
http://poj.org/problem?id=3691 http://acm.hdu.edu.cn/showproblem.php?pid=2457 DNA repair Time Limit: ...
- HDU 2825 Wireless Password(AC自动机+DP)
题目链接 做题, #include <cstdio> #include <string> #include <cstring> using namespace st ...
- [AC自己主动机+可能性dp] hdu 3689 Infinite monkey theorem
意甲冠军: 给n快报,和m频率. 然后进入n字母出现的概率 然后给目标字符串str 然后问m概率倍的目标字符串是敲数量. 思维: AC自己主动机+可能性dp简单的问题. 首先建立trie图,然后就是状 ...
- ZOJ 3494 BCD Code (AC自己主动机 + 数位DP)
题目链接:BCD Code 解析:n个病毒串.问给定区间上有多少个转换成BCD码后不包括病毒串的数. 很奇妙的题目. . 经典的 AC自己主动机 + 数位DP 的题目. 首先使用AC自己主动机,得到b ...
- HDU 2896 病毒侵袭 (AC自己主动机)
pid=2896">http://acm.hdu.edu.cn/showproblem.php?pid=2896 病毒侵袭 Time Limit: 2000/1000 MS (Java ...
- hdu 2222 Keywords Search ac自己主动机
点击打开链接题目链接 Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDU 2896 病毒侵袭 AC自己主动机题解
本题是在text里面查找key word的增强版.由于这里有多个text. 那么就不能够简单把Trie的叶子标志记录改动成-1进行加速了,能够使用其它技术.我直接使用个vis数组记录已经訪问过的节点, ...
随机推荐
- Linux重装系统后SSH登录失败
#Linux重装系统后SHH登录服务器报错 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: REMOTE H ...
- Android AsyncTask学习
Android程序有UI进程和后台进程,在执行一些耗时的操作时,如果在UI进程中,很可能出现假死的情况,用户体验会受到影响,因此,那些耗时进程往往就放在了后台进程中,用户体验能更好一些.网络情况不稳定 ...
- 关于发布DIPS的MVC项目的IIS 7.0环境配置的方法
本人技术笨拙,今天在发布DIPS的MVC4.0项目,并部署到IIS上,遇到各种问题.在查询相关资料后,最终得以解决,所以想把这个过程记录下来. 注:DIPS为一种非关系型数据库 首先,需要安装和注册D ...
- 在html页头设置不缓存
方法一:在<head>标签里增加如下meta标签. <meta http-equiv="Content-Type" content="text/html ...
- 大家来找茬-SpringMVC中Tomcat正常启动,始终访问不了Controller,出404错
创建了一个空的SpringMVC项目,Tomcat可以正常启动,但是运行的时候,始终进不了Controller,并且报404错误. 百度各种查,结果也是查不到原因.各个群里面各种求,各种贴源码,也没有 ...
- django post方法不能提交
def login(request): if request.method == 'GET': c = {} c.update(csrf(request)) return render_to_resp ...
- jQuery 文字截取
HTML <div class="summary"> <p class="news">业内知道,当赵科林“过档”联想之初,恰逢联想 ...
- 有关service
在symfony2 服务注入容器的时候参数语法可以是这样: cellcom.twig.menu_extension: class: Cellcom\WebBundle\Twig\Extension\M ...
- python bottle使用多个端口(多个进程)提高并发
我的程序是用python结合bottle框架写的,但bottle自带wsgi原本只是单进程单线程运行模式(Bottle 默认运行在内置的 wsgiref 服务器上面.这个单线程的 HTTP 服务器在开 ...
- 使用AlarmManager进行定时任务处理
1:UploadingService.java package com.example.service; import com.example.broadcast.AlarmReceiver; imp ...