博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu_3341_Lost's revenge(AC自动机+状态hashDP)
阅读量:4972 次
发布时间:2019-06-12

本文共 1468 字,大约阅读时间需要 4 分钟。

题目链接:

题意:

有n个模式串,一个标准串,现在让标准串重组,使得包含最多的模式串,可重叠,问重组后最多包含多少模式串

题解:

显然是AC自动机上的状态压缩DP,不过如果直接开404*500的数组显示开不下,所以这样要将状态hash一下,然后再DP,因为这个字母加起来为40,所以状态数不超过15000,所以可以接受。

 

1 #include
2 #define F(i,a,b) for(int i=a;i<=b;i++) 3 using namespace std; 4 5 const int AC_N=100*11,tyn=4;//数量乘串长,类型数 6 struct AC_automation{ 7 int tr[AC_N][tyn],cnt[AC_N],Q[AC_N],fail[AC_N],tot; 8 inline int getid(char x){ 9 if(x=='A')return 0;10 if(x=='C')return 1;11 if(x=='G')return 2;12 return 3;13 }14 void nw(){cnt[++tot]=0,fail[tot]=0;memset(tr[tot],0,sizeof(tr[tot]));}15 void init(){tot=-1,fail[0]=-1,nw();}16 void insert(char *s,int x=0){17 for(int len=strlen(s),i=0,w;i
=0)x2=hsh[i-1][j][k][l];52 else if(jj==1&&j-1>=0)x2=hsh[i][j-1][k][l];53 else if(jj==2&&k-1>=0)x2=hsh[i][j][k-1][l];54 else if(jj==3&&l-1>=0)x2=hsh[i][j][k][l-1];55 else continue;56 if(dp[x2][ii]==-1)continue;57 int now=AC.tr[ii][jj];58 up(dp[x1][now],dp[x2][ii]+AC.cnt[now]);59 up(ans,dp[x1][now]);60 }61 }62 printf("Case %d: %d\n",++ic,ans);63 }64 65 int main()66 {67 while(scanf("%d",&n),n)68 {69 AC.init();70 F(i,1,n)scanf("%s",s),AC.insert(s);71 AC.build(),scanf("%s",s),fuck();72 }73 return 0;74 }
View Code

 

转载于:https://www.cnblogs.com/bin-gege/p/5826346.html

你可能感兴趣的文章
Markdown不常见功能
查看>>
(二)NUnit单元测试心得
查看>>
hdu_2604Queuing(快速幂矩阵)
查看>>
frame.bounds和center
查看>>
HDU 1102 Constructing Roads
查看>>
android StaticLayout参数解释
查看>>
多线程之ThreadLocal类
查看>>
Qt-读取文本导出word
查看>>
OC语言description方法和sel
查看>>
C#中得到程序当前工作目录和执行目录的五种方法
查看>>
扫描线与悬线
查看>>
用队列和链表的方式解决约瑟夫问题
查看>>
python 迭代器与生成器
查看>>
基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD)
查看>>
[django实践]投票app
查看>>
[django]form的content-type(mime)
查看>>
iOS开发遇到的坑之六--使用cocopods管理第三方库时,编译出现Library not found for -lPods问题的解决办法...
查看>>
javascript 点点滴滴 富文本编辑器的学习2
查看>>
JQUERY —— 绑定事件
查看>>
在TabControl中的TabPage选项卡中添加Form窗体
查看>>