时间卡得紧,写成递推可以做一些优化

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<sstream>
#include<cmath>
#include<climits>
#include<string>
#include<map>
#include<queue>
#include<vector>
#include<stack>
#include<set>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define pb(a) push_back(a)
#define INF 0x1f1f1f1f
#define lson idx<<1,l,mid
#define rson idx<<1|1,mid+1,r
#define PI  3.1415926535898
template<class T> T min(const T& a,const T& b,const T& c) {return min(min(a,b),min(a,c));
}
template<class T> T max(const T& a,const T& b,const T& c) {return max(max(a,b),max(a,c));
}
void debug() {
#ifdef ONLINE_JUDGE
#elsefreopen("d:\\in.txt","r",stdin);// freopen("d:\\out1.txt","w",stdout);
#endif
}
int getch() {int ch;while((ch=getchar())!=EOF) {if(ch!=' '&&ch!='\n')return ch;}return EOF;
}const int MAX_NODE=100;
const int SIGMA_SIZE=26;
const int mod = 20090717;int ch[MAX_NODE][SIGMA_SIZE];
int val[MAX_NODE];
int fail[MAX_NODE];
int sz;void init()
{memset(ch[0],0,sizeof(ch[0]));sz=1;val[0]=0;
}
int idx(char c){return c-'a';}
void insert(const char *s,int k)
{int u=0;for(int i=0;s[i]!='\0';i++){int v=idx(s[i]);if(!ch[u][v]){memset(ch[sz],0,sizeof(ch[sz]));val[sz]=0;ch[u][v]=sz++;}u=ch[u][v];}val[u]=1<<k;
}void construct ()
{fail[0]=0;queue<int> q;for(int c=0;c<SIGMA_SIZE;c++){int u=ch[0][c];if(u){fail[u]=0;q.push(u);}}while(!q.empty()){int r=q.front();q.pop();for(int c=0;c<SIGMA_SIZE;c++){int u=ch[r][c];if(!u){ch[r][c]=ch[fail[r]][c];continue;}q.push(u);int v=fail[r];while(v&&!ch[v][c])v=fail[v];fail[u]=ch[v][c];val[u]|=val[fail[u]];}}
}int check[1<<10];
void prework()
{for(int st=0;st<(1<<10);st++){check[st]=0;int nst=st;while(nst){check[st]+=nst%2;nst/=2;}}
}
int dp[MAX_NODE][26][1<<10];int DP(int n,int m,int k)
{memset(dp,0,sizeof(dp));dp[0][0][0]=1;for(int i=0,k=0;i<n;i++,k^=1){for(int u = 0;u<sz;u++){for(int st=0;st<(1<<m);st++)if(dp[u][i][st]>0){for(int c=0;c<SIGMA_SIZE;c++){dp[ch[u][c]][i+1][st|val[ch[u][c]]]=(dp[ch[u][c]][i+1][st|val[ch[u][c]]]+dp[u][i][st])%mod;}}}}int res=0;for(int u=0;u<sz;u++){for(int st=(1<<k)-1;st<=(1<<m);st++)if(check[st]>=k)res=(res+dp[u][n][st])%mod;}return res;
}
int main()
{prework();int n,m,k;while(scanf("%d%d%d",&n,&m,&k)!=EOF&&(n+m+k)){init();for(int i=1;i<=m;i++){char buf[15];scanf("%s",buf);insert(buf,i-1);}construct();int res=DP(n,m,k);printf("%d\n",res);}return 0;
}

View Code

转载于:https://www.cnblogs.com/BMan/p/3415152.html

hdu 2825 Wireless Password AC自动机+状态DP相关推荐

  1. HDU - 2825 Wireless Password (AC自动机 + 状压dp)

    题目链接 题意 求至少包含KKK个给定字符串长度为NNN的字符串 思路 把所有可能的字符串建AC自动机,遍历所有节点dp[i][j][k]dp[i][j][k]dp[i][j][k] 表示以节点jjj ...

  2. HDU - 2825 Wireless Password(AC自动机+状压dp)

    题目链接:点击查看 题目大意:给出 m 个匹配串,问长度为 n 的字符串中,至少包含 k 个匹配串(可重叠)的字符串有多少个 题目分析:考虑到n,m,k都特别小,所以可以先用AC自动机将状态关系转移出 ...

  3. ZOJ3545——AC自动机+状态dp

    这题目是去年大连regional的题目,当时比赛的时候已经看出是道自动机+dp的题目了,但是无奈当时自己的自动机基础太弱了,被虐了一顿.今天再来做这道题目,感觉还好,思路还是蛮清晰的,但是却看出了长时 ...

  4. 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)

    3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 682  Solved: 364 Description 我们称 ...

  5. 【bzoj3530】[Sdoi2014]数数 AC自动机+数位dp

    题目描述 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运 ...

  6. 【BZOJ3530】数数(SDOI2014)-AC自动机+数位DP

    测试地址:数数 做法:本题需要用到AC自动机+数位DP. 首先看到多模式串匹配,自然想到用AC自动机来做.用AC自动机构造出状态转移图后,令f(i,j,k)f(i,j,k)f(i,j,k)为匹配了最高 ...

  7. HDU 3341 Lost's revenge(AC自动机+状态压缩DP)

    Description 给出N个优良的基因段,每段长度小于等于10,只含有AGCT四种碱基. 现给一段基因片段S,|S|<=40.对其重排列后,最多能含有多少个优良基因,基因段可以有公共部分 I ...

  8. AC自动机 + 概率dp + 高斯消元 --- HDU 5955 or 2016年沈阳icpc H [AC自动机 + 概率dp + 高斯消元]详解

    题目链接 题目大意: 就是有NNN个人,每个人都会猜一个长度为LLL的只包含{1,2,3,4,5,6}\{1,2,3,4,5,6\}{1,2,3,4,5,6}的序列,现在裁判开始投掷骰子,并且把每次的 ...

  9. HDU - 3247 Resource Archiver(AC自动机+状压dp+bfs)

    题目链接:点击查看 题目大意:给出 n 个目标串和 m 个病毒串,要求构造出一个长度最短的,且包含全部 n 个目标串,但是不能包含任意一个病毒串的01字符串,输出其最短长度 题目分析:比较综合的一道题 ...

最新文章

  1. Jenkins和Jmeter的集成
  2. 前端学习(2475):表单数据绑定处理
  3. js在div中追加html,JS把内容动态插入到DIV的实现方法
  4. 死锁、EAT、页表、单双缓冲区典型题目及解析
  5. poj 3304 Segments
  6. 三维重建笔记_多视几何_求基本矩阵F_六/七/八点法_误差评估
  7. 快速傅里叶变换FFT(一维)
  8. 【大数据搜索引擎】网络爬虫南华实验报告(2021年版)
  9. 安卓手机管理_时间管理大师手机版下载-时间管理大师app下载v1.0.0 安卓最新版...
  10. Linux - ZModem协议的sz命令传输文件异常
  11. 在html用微信跳转,H5如何跳转微信小程序?
  12. LTE学习笔记五:LTE两种帧结构
  13. win10 更新1803版本后删除自带微软拼音的方法
  14. 夜读 | 读书和不读书的人生,差别有多大
  15. ubuntu搭建dns服务器
  16. 简单的皮肤库 Skin++
  17. Chrome-Chrome源码剖析
  18. 游戏开发unity杂项知识系列:Failed to resolve project template:Failed to decompress
  19. 获取google Map API Key方法
  20. oracle 完全检查点条件,ORACLE Checkpoint(检查点)

热门文章

  1. 回文字符串—回文子串—Manacher算法
  2. JavaWeb——c:forEach varStatus=status
  3. Java实现二维码技术探讨。
  4. Java提高学习之Object(3)
  5. 《大道至简》第六章读后感及本次课后习题11.9
  6. (64位oracle使用32位的PLSQL)安装64位的oracle数据库软件,使用32位的PLSQL Developer连接方法...
  7. iOS 项目经验以及APP上架流程 _Dylan
  8. Java虚拟机一览表
  9. wpf首次项目开发技术总结wpf页面
  10. 无根树转为有根数(图论) By ACReaper