[JSOI2007] 文本生成器 - AC自动机,dp

[JSOI2007] 文本生成器 - AC自动机,dp_第1张图片

// Which pattern string occurred for the most times
#include 
using namespace std;
struct ACA {
    queue  q;
    int c[500005][26],val[500005],fi[500005],cnt,ans[1005];
    vector  g[500005];
    void init() {
        memset(c,0,sizeof c);
        memset(val,0,sizeof val);
        memset(fi,0,sizeof fi);
        memset(ans,0,sizeof ans);
        cnt=0;
    }
    void ins(char *str,int id) {
        int len=strlen(str), p=0;
        for(int i=0; i>n>>m;
    memset(p,0,sizeof p);
    AC.init();
    for(int i=1; i<=n; i++) scanf("%s",p), AC.ins(p,i), mp[i]=p;
    AC.build();
    f[0][0]=1;
    for(int i=0;i<26;i++) {
        if(AC.val[AC.c[0][i]]==0) (f[1][AC.c[0][i]]+=f[0][0])%=10007;
    }
    for(int i=1;i<=m;i++) {
        for(int j=0;j<=AC.cnt;j++) {
            for(int k=0;k<26;k++) {
                if(AC.val[AC.c[j][k]]==0)
                    (f[i+1][AC.c[j][k]]+=f[i][j])%=10007;
            }
        }
    }
    int ans = 0;
    for(int i=0;i<=AC.cnt;i++)
        (ans+=f[m][i])%=10007;
    int tot = 1;
    for(int i=1;i<=m;i++) (tot*=26)%=10007;
    cout<<(10007+tot-ans)%10007<

你可能感兴趣的:([JSOI2007] 文本生成器 - AC自动机,dp)