题目大意:给一系列字符串,用小写字母构造出长度为n的至少包含k个字符串的字符串,求能构造出的个数。

题目分析:在AC自动机上走n步,至少经过k个单词节点,求有多少种走法。

代码如下:

# include<iostream>
# include<cstdio>
# include<queue>
# include<cstring>
# include<algorithm>
using namespace std;

typedef long long LL;

const int mod=20090717;

int ch[105][26];
int cnt,fail[105];
int val[105];

void init()
{
	cnt=0;
	memset(ch,-1,sizeof(ch));
	memset(val,0,sizeof(val));
}

int idx(char x)
{
	return x-'a';
}

void insert(char *s,int k)
{
	int len=strlen(s);
	int r=0;
	for(int i=0;i<len;++i){
		int c=idx(s[i]);
		if(ch[r][c]==-1) ch[r][c]=++cnt;
		r=ch[r][c];
	}
	val[r]|=(1<<k);
}

void getFail()
{
	queue<int>q;
	fail[0]=0;
	for(int i=0;i<26;++i){
		if(ch[0][i]==-1)
			ch[0][i]=0;
		else{
			fail[ch[0][i]]=0;
			q.push(ch[0][i]);
		}
	}
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		val[u]|=val[fail[u]];
		for(int i=0;i<26;++i){
			if(ch[u][i]==-1)
				ch[u][i]=ch[fail[u]][i];
			else{
				fail[ch[u][i]]=ch[fail[u]][i];
				q.push(ch[u][i]);
			}
		}
	}
}

char word[15];
int dp[2][105][1<<10];

int getDigt(int x,int n)
{
	int count=0;
	for(int i=0;i<n;++i)
		if(x&(1<<i)) ++count;
	return count;
}

int DP(int n,int m,int k)
{
	memset(dp,0,sizeof(dp));
	int cur=1;
	dp[0][0][0]=1;
	for(int i=0;i<n;++i){
		memset(dp[cur],0,sizeof(dp[cur]));
		for(int j=0;j<=cnt;++j){
			for(int s=0;s<(1<<m);++s) if(dp[cur^1][j][s]){	///不加if语句会超时
				for(int c=0;c<26;++c){
					int &nxt=dp[cur][ch[j][c]][s|val[ch[j][c]]];
					nxt=(nxt+dp[cur^1][j][s])%mod;
				}
			}
		}
		cur^=1;
	}
	int ans=0;
	for(int i=0;i<(1<<m);++i) if(getDigt(i,m)>=k){
		for(int j=0;j<=cnt;++j)
			ans=(ans+dp[cur^1][j][i])%mod;
	}
	return ans;
}

int main()
{
	int n,m,k;
	while(scanf("%d%d%d",&n,&m,&k)&&(n||m||k))
	{
		init();
		for(int i=0;i<m;++i){
			scanf("%s",word);
			insert(word,i);
		}
		getFail();
		printf("%d\n",DP(n,m,k));
	}
	return 0;
}

HDU-2825 Wireless Password(AC自动机+状压DP)的更多相关文章

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

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

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

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

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

    题目链接 做题, #include <cstdio> #include <string> #include <cstring> using namespace st ...

  4. HDU - 2825 Wireless Password(AC自己主动机+DP)

    Description Liyuan lives in a old apartment. One day, he suddenly found that there was a wireless ne ...

  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 2825 Wireless Password(ac自己主动机&amp;amp;dp)

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

  9. hdu 6086 -- Rikka with String(AC自动机 + 状压DP)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

随机推荐

  1. Linux mysql 5.6: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

    案例环境: 操作系统 :Red Hat Enterprise Linux Server release 5.7 (Tikanga) 64 bit 数据库版本 : Mysql 5.6.19 64 bit ...

  2. ToolProvider.getSystemJavaCompiler() Return NULL!

    http://www.cnblogs.com/fangwenyu/archive/2011/10/12/2209051.html

  3. apache on centos

    httpd https://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-apache-startstop.html

  4. 网上下载的CHM帮助文件打不开的解决办法。

    我的机器 装的是 Windows server 2008 操作系统.他的安全性比较高. 我在网上下载了一个 CHM 帮助文档.结果打不开. 现象: 打开时 ,提示 安全警告, 提示:来自Interne ...

  5. decodeURIComponent

    var s = '%%' try { s = decodeURIComponent(s) } catch(e) { console.log(e) } console.log(s)

  6. POJ1661 Help Jimmy

    Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9863 Accepted: 3201 Descriptio ...

  7. asp.net中怎样调用存储过程和存储过程的写法(转载,留着自己看)

    asp.net中怎样调用存储过程和存储过程的写法 创建一个只有输入参数的存储过程 create procedure proc_user@name varchar(20),@Password varch ...

  8. 【java】随机生成6位的数字

    int radomInt = new Random().nextInt(999999); int radomInt2 =(int)((Math.random()*9+1)*100000); Syste ...

  9. Android系统的三种分屏显示模式

    Google在Android 7.0中引入了一个新特性——多窗口支持,允许用户一次在屏幕上打开两个应用.在手持设备上,两个应用可以在"分屏"模式中左右并排或上下并排显示.在电视设备 ...

  10. ASP.NET 实现重启系统或关机

    在C#程序中实现电脑的关机.重启,两种方法可以实现: 方法1:启动Shell进程,调用外部命令shutdown.exe来实现. 首先导入命名空间using System.Diagnostics;然后, ...