poj1625
来源:互联网 发布:洗头床价格300元淘宝 编辑:程序博客网 时间:2024/05/19 19:57
题目大意:求不包含禁止串的长度为m的字符串个数。
题目思路:ac自动机,不过要用高精度,需要注意的是字符串有空格,而且要用无符号字符型,以前写的高精度用的是字符串模拟,这次见网上都用整型,且每一个整型数存多位十进制,而且效率很高,就果断学习了。
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<string>#include<queue>#include<algorithm>#include<vector>#include<stack>#include<list>#include<iostream>#include<map>using namespace std;#define inf 0x3f3f3f3f#define Max 110#define mod 1000000000int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a<b?a:b;}int q[11*11],cnt,n;unsigned char str[60];int mp[300];struct node{ int cnt,fail; int next[50]; void init() { cnt=fail=0; memset(next,0,sizeof(next)); }}tri[11*11];struct bignum{ int d[11];}c;bignum dp[55][110],ans;void add(bignum &a,bignum &b){ int i; memset(c.d,0,sizeof(c.d)); int len=max(a.d[0],b.d[0]); for(i=1;i<=len;i++) { if(i<=a.d[0]) c.d[i]+=a.d[i]; if(i<=b.d[0]) c.d[i]+=b.d[i]; c.d[i+1]+=c.d[i]/mod; c.d[i]%=mod; a.d[i]=c.d[i]; } a.d[0]=len; if(c.d[len+1]) { a.d[len+1]=c.d[len+1]; a.d[0]=len+1; }}void output(bignum ans){ int i,j; printf("%d",ans.d[ans.d[0]]); for(i=ans.d[0]-1;i>=1;i--) { printf("%09d",ans.d[i]); } puts("");}void insert(unsigned char *s){ int i,x,p; p=0; for(i=0;s[i];i++) { x=mp[s[i]]; if(!tri[p].next[x]) { tri[++cnt].init(); tri[p].next[x]=cnt; } p=tri[p].next[x]; } tri[p].cnt++;}void bfs(){ int i,p=0,suf,head=0,tail=0; for(i=0;i<n;i++) { if(tri[0].next[i]) { q[tail++]=tri[0].next[i]; tri[q[tail-1]].fail=0; } } while(head<tail) { p=q[head++];suf=tri[p].fail; tri[p].cnt+=tri[suf].cnt; for(i=0;i<n;i++) { if(tri[p].next[i]) { q[tail++]=tri[p].next[i]; tri[q[tail-1]].fail=tri[suf].next[i]; } else tri[p].next[i]=tri[suf].next[i]; } }}void solve(int m){ int i,j,k; for(i=0;i<=m;i++) for(j=0;j<=cnt;j++) dp[i][j].d[0]=0; dp[0][0].d[0]=1;dp[0][0].d[1]=1; for(i=0;i<m;i++) { for(j=0;j<=cnt;j++) { if(tri[j].cnt) continue; for(k=0;k<n;k++) { int tmp=tri[j].next[k]; if(!tri[tmp].cnt) add(dp[i+1][tmp],dp[i][j]); } } } ans.d[0]=1;ans.d[1]=0; for(i=0;i<=cnt;i++) { if(!tri[i].cnt) add(ans,dp[m][i]); }}int main(){ int m,p,i,j; while(scanf("%d%d%d",&n,&m,&p)!=EOF) { getchar(); cnt=0;tri[0].init(); for(i=0;(str[i]=getchar())!='\n';i++) mp[str[i]]=i; str[i]=0; while(p--) { for(i=0;(str[i]=getchar())!='\n';i++); str[i]=0; insert(str); } bfs(); solve(m); output(ans); }}
- poj1625
- poj1625
- poj1625 Censored!
- POJ1625 Censored!
- POJ1625-Censored!
- [poj1625] 检查Censored!
- POJ1625----AC自动机+大数+DP
- POJ1625--AC自动机+DP+大数
- AC自动机+DP+大数poj1625
- poj1625 Censored! AC自动机+DP
- AC自动机+dp+大数 poj1625
- POJ1625-(AC自动机+DP+大数)
- POJ1625 Censored! AC自动机+DP+高精度
- poj1625 Censored! AC自动机DP、高精度
- poj1625 Censored! 高精度+ac机+dp
- POJ1625---Censored!(AC自动机+dp+高精度)
- POJ1625 DP+AC自动机+大数加法
- POJ1625 Censored! AC自动机+dp+高精度
- 2013-04 清明节那一周总结
- Android的数据处理:使用annotation实现JSON字符串解析为java对象
- 学习总结
- pyramid 照着这个来就行了开始 [早晨起来看)
- org.gjt.mm.mysql.Driver与com.mysql.jdbc.Driver区别
- poj1625
- 树上的三角形 --Beauty of Programming(2013全国挑战赛)
- 文本编码管理encoding_manager
- POJ 1272 小希的迷宫【并查集+无向图判断是否有环 PS:和前一篇判断入度是否为1的很像】
- ERMaster
- PHP验证码的实现
- 关于x=x+1、x+=1、x++的执行效率问题
- php一些知识【4月份】
- 回话跟踪