【AC自动机】【状压dp】hdu2825 Wireless Password-程序员宅基地

f(i,j,S)表示当前字符串总长度为i,dp到AC自动机第j个结点,单词集合为S时的方案数。

要注意有点卡常数,注意代码里的注释。

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
queue<int>q;
#define MOD 20090717;
int child[111][26],fail[111],size,f[30][111][1100],tag[111];
void Insert(char S[],int id)
{
    int len=strlen(S);
    int now=0;
    for(int i=0;i<len;++i)
      {
        if(!child[now][S[i]-'a'])
          child[now][S[i]-'a']=size++;
        now=child[now][S[i]-'a'];
      }
    tag[now]|=(1<<id);
}
void build()
{
    fail[0]=-1;
    q.push(0);
    while(!q.empty())
      {
        int U=q.front(); q.pop();
        for(int i=0;i<26;++i)
          if(child[U][i])
            {
              int V=fail[U];
              while(V!=-1)
                {
                  if(child[V][i])
                    {
                      fail[child[U][i]]=child[V][i];
                      break;
                    }
                  V=fail[V];
                }
              if(V==-1)
                fail[child[U][i]]=0;
              tag[child[U][i]]|=tag[fail[child[U][i]]];
              q.push(child[U][i]);
            }
          else if(U)
            child[U][i]=child[fail[U]][i];
      }
}
void Init()
{
    memset(child,0,sizeof(child));
    memset(fail,0,sizeof(fail));
    memset(tag,0,sizeof(tag));
    size=1;
}
int n,m,K;
bool check(int x)
{
	int res=0;
	for(int i=0;i<m;++i)
	  res+=((x>>i)&1);
	return res>=K;
}
int main()
{
	//freopen("hdu2825.in","r",stdin);
	char s[13];
	while(1)
	  {
	  	scanf("%d%d%d",&n,&m,&K);
	  	if(n==0 && m==0 && K==0)
	  	  break;
	  	Init();
	  	for(int i=0;i<m;++i)
	  	  {
	  	  	scanf("%s",s);
	  	  	Insert(s,i);
	  	  }
	  	build();
		for(int i=0;i<=n;++i)
	  	  for(int j=0;j<size;++j)
	  	    for(int k=0;k<(1<<m);++k)
	  		  f[i][j][k]=0;//用memset也许会TLE 
	  	f[0][0][0]=1;
	  	for(int i=0;i<n;++i)
	  	  for(int j=0;j<size;++j)
	  	    for(int k=0;k<(1<<m);++k)
	  	      {
	  	      	if(!f[i][j][k])//不加会TLE 
	  	      	  continue;
	  	      	for(int l=0;l<26;++l)
	  	    	  f[i+1][child[j][l]][k|tag[child[j][l]]]=
					(f[i+1][child[j][l]][k|tag[child[j][l]]]+f[i][j][k])%MOD;
	  	      }
	  		  
		int ans=0;
		for(int i=0;i<(1<<m);++i)
		  if(check(i))
		    for(int j=0;j<size;++j)
		      ans=(ans+f[n][j][i])%MOD;
		printf("%d\n",ans);
	  }
	return 0;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/6504830.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34290631/article/details/93590030

智能推荐

Xshell实现Windows上传文件到Linux主机_xshell如何将windows文件上传到linux-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏3次。转载:http://www.linuxidc.com/Linux/2015-05/117975.htm1、使用我们常用的Xshell登录工具,新建立一个远程会话,填写ip地址及用户名密码后,选择最下面的ZMODEM,填写下载的路径,加载的路径;2个路径可以一样也可以不一样;2、在Linux主机上,安装上传下载工具包rz及sz如果不知道你要安装包的具体名称_xshell如何将windows文件上传到linux

svn 和 git的简单使用_java svn git用法-程序员宅基地

文章浏览阅读528次。全部采用终端操作,未采用客户端辅助.svn找到你要保存和操作的路径1.check out (简写co) svn co path例如:svn co svn://192.168.0.1/demo/ss2.add(添加文件)svn add file例如 svn add download.h注意,添加完成文件后,要提交3.提交svn commit -m"lo_java svn git用法

nginx之基础命令(启动、停止、平滑重启、平滑升级)_平滑停止 nginx 服务命令-程序员宅基地

文章浏览阅读1.3k次。一、nginx启动1、/usr/local/nginx/sbin/nginx -c nginx配置目录2、/usr/local/nginx/sbin/nginx 默认启动nginx安装目录中conf目录中的nginx.conf二、nginx停止使用 kill -信号 nginx.pid 其中nginx进程号,可以使用 ps -ef | grep "ngin_平滑停止 nginx 服务命令

论文阅读-《BlitzNet: A Real-Time Deep Network for Scene Understanding》-程序员宅基地

文章浏览阅读3.2k次。ICCV 20171.Motivation:为了做到实时的目标检测和语义分割 2.Framework 采用的是Resnet50+SSD, ssd这种one-stage的检测器天生适合和分割一块做。上采样过程用到的block如下图所示,除了正常的skip connection之外,还用上了residual connection 3.Experiments作者在VOC2007/2012以及COCO

go 编译报错go tool: no such tool compile-程序员宅基地

文章浏览阅读2.3w次,点赞3次,收藏6次。问题简述: 在Ubuntu 16.04.4 LTS:使用新安装的go编译任何东西都报错。问题定位: 执行go env命令查看结果如下:ubuntu@ip-172-31-27-10:~$ go envGOARCH="amd64"GOBIN=""GOEXE=""GOHOSTARCH="amd64"GOHOSTOS="linux"GOOS="linux"GOPATH=&

eclipse对齐快捷键失败解决方法_eclipse对齐失效-程序员宅基地

文章浏览阅读2.3k次。win10中,ctrl+shift+F对齐键会失效,被微软自带的输入法的简繁体切换占用了。 我查看了下,并没找到输入法的这个热键的去除方法。只能更改eclipse的对齐键。 如图_eclipse对齐失效

随便推点

Linux 配置双显示器-程序员宅基地

文章浏览阅读1.6k次。转载地址:http://i.cn.yahoo.com/shiyufeng/blog/p_40/原文作者:LionUbuntu 8.04/8.10 设置笔记本电脑双显示器目录:1、设置显示分辨率及 xrandr 介绍2、GNOME下切换双屏的方法3、关于双屏下 GNOME面板/ wine / 阿里旺旺的一些问题及解决正文:1. 设置显示分辨率及 xrandr 介绍X Windo..._linuxshaungxianshiqi1

指纹识别-(7)指纹图像预处理算法之图像增强_指纹图像增强-程序员宅基地

文章浏览阅读7.7k次。5、指纹图像的增强在指纹图像中,具有清晰的频率和方向的平行脊和谷的配置可提供有用的信息,以帮助消除不必要的噪声。由脊和谷组成的正弦波在局部恒定的方向上缓慢变化。因此,调谐到相应频率和方向的带通滤波器可以有效消除不想要的噪声,并保留真正的脊谷结构。Gabor滤波器具有频率选择性和 方向选择性,并且在空间和频率域均具有最佳的联合分辨率。Hong等人将Gabor滤波器用于指纹图像增强,之后被广泛......_指纹图像增强

Altium打开AD文件,并不是居中,在左下角或其他位置//或者在点击鼠标时候,界面自动跳到界面中心位置,怎么弄?我教你_ad中pcb不在视野中了怎么办-程序员宅基地

文章浏览阅读8k次,点赞2次,收藏8次。打开AD后的PCB,我们可以看到我们的PCB界面在左下角,缩小后看到不在居中。这个时候需要我们按V+F或者 V+D使其在我们电脑中居中,但是实际情况下,缩小后发现还是不居中,但是没有关系。..._ad中pcb不在视野中了怎么办

SystemVerilog中的$cast()向下类型转换_$cast()转化-程序员宅基地

文章浏览阅读961次。SystemVerilog中的$cast()向下类型转换_$cast()转化

旷视人脸识别SDK 粗略分类剖析-程序员宅基地

文章浏览阅读1.5k次。旷视人脸识别SDK API 分类_旷视人脸识别sdk

stm32 IIC驱动BH1750光照强度传感器/GY302模块_光照传感器gy302电压-程序员宅基地

文章浏览阅读9.8k次,点赞24次,收藏122次。STM32f1系列单片机驱动BH1750转发此文请标明出去!首先说明下**GY302模块上面其实就是一个BH1750芯片**,然后加了一小丢丢的外部驱动电路,实际上本质来说没什么区别,用起来一样。简单的来说下BH1750这款光照强度传感器吧,输入电压VCC在3.0v-3.6v之间,我们一般都是使用3.3v供电啦,通讯采用标准的IIC协议,自身的IIC地址可以有两种选择,怎么选择请..._光照传感器gy302电压

推荐文章

热门文章

相关标签