• 字典树


    #include<bits/stdc++.h>
    using namespace std;
    #define IO ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
    const int maxnode=700000+5;
    const int sigma_size=26;
    const int mod=20071027;
    char tmp[200+5];
    char st[maxnode];
    int dp[maxnode];
    int ch[maxnode][sigma_size];
    int val[maxnode];
    struct Trie
    {
    
        int sz;
        Trie()
        {
            sz=1;memset(ch[0],0,sizeof(ch[0]));
        }
        int idx(char c){return c-'a';}
        void Insert(char *s,int v)
        {
            int u=0,n=strlen(s);
            for(int i=0;i<n;i++){
                int c=idx(s[i]);
                if(!ch[u][c]){
                    memset(ch[sz],0,sizeof(ch[sz]));
                    val[sz]=0;
                    ch[u][c]=sz++;
                }
                u=ch[u][c];
            }
            val[u]=v;
        }
        int Find(char *s,int pos)
        {
            int ans=0;
            int u=0,n=strlen(s);
            for(int i=pos;i<n&&i<=pos+100;i++){
                int c=idx(s[i]);
                if(!ch[u][c]) return ans;
                u=ch[u][c];
                if(val[u])
                    ans=(dp[i+1]+ans)%mod;
            }
            return ans;
        }
    
    };
    Trie T;
    int32_t main()
    {
        int n,cas=0;
        while(scanf("%s",st)==1){
            T=Trie();
            scanf("%d",&n);
            for(int i=0;i<n;i++){
                scanf("%s",tmp);
                T.Insert(tmp,1);
            }
            int len=strlen(st);
            dp[len]=1;
            for(int i=len-1;i>=0;i--){
                dp[i]=T.Find(st,i);
            }
            printf("Case %d: %d
    ",++cas,dp[0]);
        }
    }
  • 相关阅读:
    [NOI2001]炮兵阵地 状压DP
    [GDOI2014]拯救莫莉斯 状压DP
    [ZJOI2010]数字计数 数位DP
    [APIO2007]动物园 状压DP
    [SDOI2013]淘金 数位DP
    环状最大两段子段和
    [清华集训2014]奇数国
    [HNOI2003]激光炸弹
    [SCOI2010]字符串
    [SCOI2005]扫雷
  • 原文地址:https://www.cnblogs.com/033000-/p/10317576.html
Copyright © 2020-2023  润新知