【bzoj 1030】文本生成器(AC自动机+DP)
2018-01-31 17:12
393 查看
传送门biu~
要计算可读文本数量,可以先计算所有不可读的文本数量,即不能匹配到任何模式串的方案数,再用26m26m减去即可。
将AC自动机上所有危险点标记,fi,jfi,j表示匹配jj个字母后刚好在AC自动机的ii号节点上(不匹配危险点)的方案数。转移时,假设节点ii和它的儿子xx都不是危险的,那么fx,j+1+=fi,jfx,j+1+=fi,j(可以采用刷表法)。最后用26m26m减去Σfi,mΣfi,m即可。
要计算可读文本数量,可以先计算所有不可读的文本数量,即不能匹配到任何模式串的方案数,再用26m26m减去即可。
将AC自动机上所有危险点标记,fi,jfi,j表示匹配jj个字母后刚好在AC自动机的ii号节点上(不匹配危险点)的方案数。转移时,假设节点ii和它的儿子xx都不是危险的,那么fx,j+1+=fi,jfx,j+1+=fi,j(可以采用刷表法)。最后用26m26m减去Σfi,mΣfi,m即可。
#include<bits/stdc++.h> using namespace std; const int mod=10007;char s[1005]; int n,m,cnt,ans,f[100005][150]; struct Node{ Node *ch[26],*nex; bool b;int num; Node(); }*root=new Node,*pre[100005]; Node :: Node(){ nex=NULL;b=false; for(int i=0;i<26;++i) ch[i]=NULL; num=++cnt;pre[cnt]=this; } inline void Insert(char s[]){ Node *x=root; for(int i=1;s[i];++i){ int to=s[i]-'A'; if(!x->ch[to]) x->ch[to]=new Node; x=x->ch[to]; } x->b=true; } queue<Node*>q; inline void GetFail(){ root->nex=root; for(int i=0;i<26;++i){ if(root->ch[i]) q.push(root->ch[i]),root->ch[i]->nex=root; else root->ch[i]=root; } while(!q.empty()){ Node *x=q.front();q.pop(); for(int i=0;i<26;++i){ if(x->ch[i]) q.push(x->ch[i]),x->ch[i]->nex=x->nex->ch[i]; else x->ch[i]=x->nex->ch[i]; } Node *tmp=x; while(tmp!=root && !tmp->b) tmp=tmp->nex; if(tmp->b) x->b=true; } } inline void dp(){ f[root->num][0]=1; for(int i=0;i<m;++i){ for(int j=1;j<=cnt;++j){ if(pre[j]->b || !f[j][i]) continue; for(int k=0;k<26;++k){ if(pre[j]->ch[k]->b) continue; (f[pre[j]->ch[k]->num][i+1]+=f[j][i])%=mod; } } } for(int i=1;i<=cnt;++i) ans=(ans+f[i][m])%mod; } inline int ksm(int p,int n){ int re=1; while(n){ if(n&1) re=re*p%mod; p=p*p%mod; n>>=1; } return re; } int main(){ scanf("%d%d",&n,&m); while(n--) scanf("%s",s+1),Insert(s); GetFail();dp(); ans=(ksm(26,m)-ans+mod)%mod; printf("%d\n",ans); return 0; }
相关文章推荐
- bzoj1030 文本生成器(AC自动机+dp)
- BZOJ1030 [JSOI2007]文本生成器 补全AC自动机+简单DP
- [BZOJ1030][JSOI2007]文本生成器(AC自动机+dp)
- [BZOJ1030][JSOI2007]文本生成器(AC自动机+dp)
- BZOJ_1030_[JSOI2007]_文本生成器_(AC自动机+DP)
- [BZOJ 1030][JSOI2007]文本生成器(AC自动机+DP)
- 【bzoj 1030】 [JSOI2007]文本生成器(AC自动机+dp)
- bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)
- bzoj1030: [JSOI2007]文本生成器(AC自动机+Dp)
- bzoj 1030 [JSOI2007]文本生成器(AC自动机+DP)
- bzoj 1030: [JSOI2007]文本生成器 (ac自动机上的dp)
- BZOJ1030 [JSOI2007]文本生成器(AC自动机+dp)
- [BZOJ]1030: [JSOI2007]文本生成器 AC自动机+DP
- bzoj1030 [JSOI2007]文本生成器(AC+dp)
- [BZOJ1030]-[JSOI2007]文本生成器-AC自动机+dp
- bzoj 1030: [JSOI2007]文本生成器 (ac自己主动机上的dp)
- bzoj1030(ac自动机+dp)
- [bzoj1030][JSOI2007]文本生成器——AC自动机
- 【BZOJ4820】[Sdoi2017]硬币游戏 AC自动机+概率DP+高斯消元
- 【BZOJ-1030】文本生成器 AC自动机 + DP