• UVALive 3942 Remember the Word Tire+DP


    dp[i]=sum{dp[j]} ,s[i...j-1]为出现过的单词,每次从s[i]开始查找全部出现的前缀s[i..j],前缀在Tire中存在则转移状态。

    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<iostream>
    #include<sstream>
    #include<cmath>
    #include<climits>
    #include<string>
    #include<map>
    #include<queue>
    #include<vector>
    #include<stack>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pii;
    #define pb(a) push_back(a)
    #define INF 0x1f1f1f1f
    #define lson idx<<1,l,mid
    #define rson idx<<1|1,mid+1,r
    #define PI  3.1415926535898
    template<class T> T min(const T& a,const T& b,const T& c) {
        return min(min(a,b),min(a,c));
    }
    template<class T> T max(const T& a,const T& b,const T& c) {
        return max(max(a,b),max(a,c));
    }
    void debug() {
    #ifdef ONLINE_JUDGE
    #else
    
        freopen("d:\in.txt","r",stdin);
        freopen("d:\out1.txt","w",stdout);
    #endif
    }
    int getch() {
        int ch;
        while((ch=getchar())!=EOF) {
            if(ch!=' '&&ch!=' ')return ch;
        }
        return EOF;
    }
    struct TireNode
    {
        int flag;
        TireNode *next[26];
        TireNode()
        {
            flag=0;
            for(int i=0;i<26;i++)
                next[i]=NULL;
        }
    }*root;
    
    int Insert(const char *s)
    {
        TireNode *p=root;
        for(int i=0;s[i]!='';i++)
        {
            int v=s[i]-'a';
            if(p->next[v]==NULL)
            {
                p=p->next[v]=new TireNode;
            }else p=p->next[v];
        }
        p->flag=1;
        return 0;
    }
    char str[300300];
    int dp[300300];
    int f(int k)
    {
        if(str[k]=='')return 1;
        if(dp[k]>=0)return dp[k];
        int x=0;
        TireNode *p=root;
        for(int i=0;str[i+k]!='';i++)
        {
            int v=str[i+k]-'a';
            if(p->next[v]==NULL)break;
            else p=p->next[v];
            if(p->flag)
            {
                x=(x+f(i+k+1))%20071027;
            }
        }
        return dp[k]=x;
    }
    int del(TireNode *p)
    {
        for(int i=0;i<26;i++)
        {
            if(p->next[i]!=NULL)
                del(p->next[i]);
        }
        delete p;
    }
    int main()
    {
        int ca=0;
        while(scanf("%s",str)!=EOF)
        {
            root=new TireNode;
            int n;
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
            {
                char s[110];
                scanf("%s",s);
                Insert(s);
            }
            memset(dp,-1,sizeof(dp));
            int num=f(0);
            printf("Case %d: %d
    ",++ca,num);
            del(root);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    写在最前面
    Bzoj 2281 [Sdoi2011]黑白棋 题解
    bzoj3125: CITY 题解
    CDQZ 集训大总结
    CDQZ集训DAY10 日记
    CDQZ集训DAY9 日记
    CDQZ集训DAY7 日记
    CDQZ集训DAY6 日记
    CDQZ集训DAY5 日记
    CDQZ集训DAY4 日记
  • 原文地址:https://www.cnblogs.com/BMan/p/3294294.html
Copyright © 2020-2023  润新知