题目大意:给一系列字符串,用小写字母构造出长度为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. hdu 2825 Wireless Password(ac自己主动机&amp;amp;dp)

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

  8. HDU4758 Walk Through Squares(AC自动机+状压DP)

    题目大概说有个n×m的格子,有两种走法,每种走法都是一个包含D或R的序列,D表示向下走R表示向右走.问从左上角走到右下角的走法有多少种走法包含那两种走法. D要走n次,R要走m次,容易想到用AC自动机 ...

  9. POJ1699 Best Sequence(AC自动机+状压DP)

    题目,求包含所有的给定的n个DNA片段的序列的最短长度. AC自动机上的DP题. dp[S][u]表示已经包含的DNA片段集合为S,且当前后缀状态是自动机第u个结点的最短长度 dp[0][0]=0 我 ...

随机推荐

  1. BootStrap学习笔记,优缺点总结

    本篇约定Bootstrap简写为BT   BT的受欢迎程度是大家有目共睹的,用它可以快速的搭建出网站.很早就接触过这个框架,其中的栅格系统,css模块化以及js插件做的相当不错,由于工作中较少使用也一 ...

  2. C连接MySQL数据库开发之Windows环境配置及测试(转)

    http://blog.csdn.net/xyang81/article/details/26814633(转)

  3. 哆啦A梦 canvas

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. poj 3101Astronomy(圆周追击+分数最小公倍数)

    /* 本题属于圆周追击问题: 假设已知两个圆周运动的物体的周期分别是a ,b, 设每隔时间t就会在同一条直线上 在同一条直线上的条件是 角度之差为 PI ! 那么就有方程 (2PI/a - 2PI/b ...

  5. POJ 1065

    http://poj.org/problem?id=1065 题目的大体意思就是给一些木头长l,重w,有一个机器,如果切割这些木头的话,在i后面切割的i+1根木头满足长度和重量都要大于等于前一根则不需 ...

  6. 攻城狮在路上(壹) Hibernate(十一)--- 映射实体关联关系

    本文以Customer和Address类的关系为例说明一对一关联映射:以Category和Item类的关系说明多对多关联关系.一.映射一对一关联: 分两种情况:按照外键映射和按照主键映射.这两种方式的 ...

  7. Android ActionBar Home按钮返回事件处理的两种方式

    今早无聊查看了一下android官方文档,最近对ActionBar很感兴趣,它确实对我们的日常开发起到了很便捷的作用. 对于通过点击ActionBar的Home按钮返回,以前我只知道有一种方式:也就是 ...

  8. Java多线程初学者指南系列教程

    转自:http://developer.51cto.com/art/200911/162925.htm 51cto 本系列来自NokiaGuy的“真的有外星人吗”博客,系列名称为<Java多线程 ...

  9. software glue Middleware

    https://en.wikipedia.org/wiki/Middleware https://zh.wikipedia.org/wiki/中间件 Middleware is computer so ...

  10. PHP中MySql函数收集

    1.array mysql_fetch_assoc ( resource $result ) 从结果集中取得一行作为关联数组 说明:  返回对应结果集的关联数组,并且继续移动内部数据指针. 参数:re ...