• JSOI2007 文本生成器


    题目链接:戳我

    非常不好意思,因为想要排版,所以今天先只把代码贴出来,题解明天补。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #define MAXN 6010
    #define mod 10007
    using namespace std;
    int n,m,tot;
    int dp[MAXN][MAXN];
    char ss[MAXN];
    struct Node{int ch[26],fail,end;}t[MAXN<<1];
    inline int fpow(int x,int y)
    {
        int cur_ans=1;
        while(y)
        {
            if(y&1) cur_ans=1ll*cur_ans*x%mod;
            x=1ll*x*x%mod;
            y>>=1;
        }
        return cur_ans;
    }
    inline void build(char *s)
    {
        int len=strlen(s+1),x=0;
        for(int i=1;i<=len;i++)
        {
            if(!t[x].ch[s[i]-'A']) t[x].ch[s[i]-'A']=++tot;
            x=t[x].ch[s[i]-'A'];
        }
        t[x].end=1;
    }
    inline void get_fail()
    {
        queue<int>q;
        int x=0;
        for(int i=0;i<26;i++)
            if(t[x].ch[i])
                t[t[x].ch[i]].fail=0,q.push(t[x].ch[i]);
        while(!q.empty())
        {
            int u=q.front();q.pop();
            t[u].end|=t[t[u].fail].end;
            for(int i=0;i<26;i++)
            {
                if(t[u].ch[i]) t[t[u].ch[i]].fail=t[t[u].fail].ch[i],q.push(t[u].ch[i]);
                else t[u].ch[i]=t[t[u].fail].ch[i];
            }
        }
    }
    int main()
    {
        #ifndef ONLINE_JUDGE
        freopen("ce.in","r",stdin);
        #endif
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%s",ss+1);
            build(ss);
        }
        get_fail();
        dp[0][0]=1;
        int ans=fpow(26,m)%mod,cur_ans=0;
        for(int i=1;i<=m;i++)
            for(int j=0;j<=tot;j++)
                for(int k=0;k<26;k++)
                {
                    // cout<<t[j].ch[k]<<endl;
                    if(t[t[j].ch[k]].end==0)
                    {
                        dp[t[j].ch[k]][i]=(dp[t[j].ch[k]][i]+dp[j][i-1])%mod;
                        // printf("%d
    ",dp[t[j].ch[k]][i]);
                    }
                }
        for(int i=0;i<=tot;i++) cur_ans=(cur_ans+dp[i][m])%mod;
        // printf("cur_ans=%d
    ",cur_ans);
        printf("%d
    ",(ans+mod-cur_ans)%mod);
        return 0;
    }
    
  • 相关阅读:
    新人手册
    使用koa-mysql-session时报错
    自建windows服务器如何部署egg应用
    mac os 10.15 virtualBox6.0.12崩溃
    thinkphp3.2 上传图片兼容小程序
    PHP版本微信支付开发
    php mysql 按照指定年月查找数据 数据库create_time为时间戳
    Mac OS 查看端口和杀死进程
    MAC PHP7 如何disable xdebug
    TCP为什么是三次握手,为什么不是两次或者四次 && TCP四次挥手
  • 原文地址:https://www.cnblogs.com/fengxunling/p/10884282.html
Copyright © 2020-2023  润新知