uva3942 字典树加dp

来源:互联网 发布:淘宝联盟已收货不结算 编辑:程序博客网 时间:2024/06/08 07:12
#include <cstdio>#include <iostream>#include <algorithm>#include <queue>#include <cmath>#include <cstring>#include <stack>#include <set>#include <map>#include <vector>using namespace std;#define INF 0x2fffffff#define LL long long#define MAX(a,b) ((a)>(b))?(a):(b)#define MIN(a,b) ((a)<(b))?(a):(b)#define id(a) ((a-'a'))char s[300005];int sz;const int maxnode = 4000*100+100;int ch[maxnode][26];int val[maxnode];int dp[300005];void insert(char *s){    int n = strlen(s);    int u = 0;    for(int i = 0;i < n;i++){        int c = id(s[i]);        if(!ch[u][c]){            val[sz] = 0;            memset(ch[sz],0,sizeof(ch[sz]));            ch[u][c] = sz ++;        }        u = ch[u][c];    }    val[u] = 1;}int query(int loc,int c){    int u  = 0;    int n = loc + c;    for(int i = loc;i <= n;i++){        int  c = id(s[i]);        if(!ch[u][c]){            return false;         }        u = ch[u][c];    }    return val[u];}int main(){    int cc = 1;    while(scanf("%s",s)!=EOF){        int t;        int len = strlen(s);        memset(ch[0],0,sizeof(ch[0]));        memset(dp,0,sizeof(dp));        sz = 1;        scanf("%d",&t);        char a[200];        while(t--){            scanf("%s",a);            insert(a);        }        dp[len] = 1;        for(int i= len-1;i >=0 ;i--){            for(int j = 0;j < 100 && j+i < len;j++){                if(query(i,j)){                    dp[i] += dp[i+j+1];                    dp[i] %= 20071027;                }            }        }         printf("Case %d: %d\n",cc++,dp[0]);    }    return 0;}

开始的时候采用记忆化搜索超时了,换成dp就可以过了,dp就是非递归的记忆化搜索!

0 0