hdu 2825 Wireless Password AC自动机+状态DP
时间卡得紧,写成递推可以做一些优化
//#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相关推荐
- HDU - 2825 Wireless Password (AC自动机 + 状压dp)
题目链接 题意 求至少包含KKK个给定字符串长度为NNN的字符串 思路 把所有可能的字符串建AC自动机,遍历所有节点dp[i][j][k]dp[i][j][k]dp[i][j][k] 表示以节点jjj ...
- HDU - 2825 Wireless Password(AC自动机+状压dp)
题目链接:点击查看 题目大意:给出 m 个匹配串,问长度为 n 的字符串中,至少包含 k 个匹配串(可重叠)的字符串有多少个 题目分析:考虑到n,m,k都特别小,所以可以先用AC自动机将状态关系转移出 ...
- ZOJ3545——AC自动机+状态dp
这题目是去年大连regional的题目,当时比赛的时候已经看出是道自动机+dp的题目了,但是无奈当时自己的自动机基础太弱了,被虐了一顿.今天再来做这道题目,感觉还好,思路还是蛮清晰的,但是却看出了长时 ...
- 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 682 Solved: 364 Description 我们称 ...
- 【bzoj3530】[Sdoi2014]数数 AC自动机+数位dp
题目描述 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运 ...
- 【BZOJ3530】数数(SDOI2014)-AC自动机+数位DP
测试地址:数数 做法:本题需要用到AC自动机+数位DP. 首先看到多模式串匹配,自然想到用AC自动机来做.用AC自动机构造出状态转移图后,令f(i,j,k)f(i,j,k)f(i,j,k)为匹配了最高 ...
- HDU 3341 Lost's revenge(AC自动机+状态压缩DP)
Description 给出N个优良的基因段,每段长度小于等于10,只含有AGCT四种碱基. 现给一段基因片段S,|S|<=40.对其重排列后,最多能含有多少个优良基因,基因段可以有公共部分 I ...
- 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}的序列,现在裁判开始投掷骰子,并且把每次的 ...
- HDU - 3247 Resource Archiver(AC自动机+状压dp+bfs)
题目链接:点击查看 题目大意:给出 n 个目标串和 m 个病毒串,要求构造出一个长度最短的,且包含全部 n 个目标串,但是不能包含任意一个病毒串的01字符串,输出其最短长度 题目分析:比较综合的一道题 ...
最新文章
- Jenkins和Jmeter的集成
- 前端学习(2475):表单数据绑定处理
- js在div中追加html,JS把内容动态插入到DIV的实现方法
- 死锁、EAT、页表、单双缓冲区典型题目及解析
- poj 3304 Segments
- 三维重建笔记_多视几何_求基本矩阵F_六/七/八点法_误差评估
- 快速傅里叶变换FFT(一维)
- 【大数据搜索引擎】网络爬虫南华实验报告(2021年版)
- 安卓手机管理_时间管理大师手机版下载-时间管理大师app下载v1.0.0 安卓最新版...
- Linux - ZModem协议的sz命令传输文件异常
- 在html用微信跳转,H5如何跳转微信小程序?
- LTE学习笔记五:LTE两种帧结构
- win10 更新1803版本后删除自带微软拼音的方法
- 夜读 | 读书和不读书的人生,差别有多大
- ubuntu搭建dns服务器
- 简单的皮肤库 Skin++
- Chrome-Chrome源码剖析
- 游戏开发unity杂项知识系列:Failed to resolve project template:Failed to decompress
- 获取google Map API Key方法
- oracle 完全检查点条件,ORACLE Checkpoint(检查点)
热门文章
- 回文字符串—回文子串—Manacher算法
- JavaWeb——c:forEach varStatus=status
- Java实现二维码技术探讨。
- Java提高学习之Object(3)
- 《大道至简》第六章读后感及本次课后习题11.9
- (64位oracle使用32位的PLSQL)安装64位的oracle数据库软件,使用32位的PLSQL Developer连接方法...
- iOS 项目经验以及APP上架流程 _Dylan
- Java虚拟机一览表
- wpf首次项目开发技术总结wpf页面
- 无根树转为有根数(图论) By ACReaper