UVA3942(字典树加DP)

来源:互联网 发布:雷克萨斯es300h 知乎 编辑:程序博客网 时间:2024/06/10 01:34
#include <iostream>#include<stdio.h>#include<cstdlib>#include<string>#include<string.h>using namespace std;const int maxnum=27;const int mod=20071027;const int maxnode=500005;int dp[maxnode];struct trie{    int ch[maxnode][maxnum];    int val[maxnode];    int sz;    void init()    {        sz=1;        memset(ch[0],0,sizeof(ch[0]));    }    int idx(char c)    {        return c-'a';    }    void insert(char *word,int v)    {        int u=0,n=strlen(word),i;        for(i=0;i<n;i++)        {            int c=idx(word[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 query(char *word,int start)    {        int u=0,n=strlen(word),i;        int ret=0;        for(i=start;i<n;i++)        {            int c=idx(word[i]);            if(ch[u][c]==0)                return ret;            u=ch[u][c];            if(val[u])            {                ret+=dp[i+1];                ret%=mod;            }        }       return ret;    }}root;int main(){  char s[maxnode];  int cas=1;  while(scanf("%s",s)!=EOF)  {      root.init();      memset(dp,0,sizeof(dp));      int n,i;      scanf("%d",&n);      for(i=1;i<=n;i++)      {          char word[105];          //cout<<"haha"<<endl;          scanf("%s",word);          root.insert(word,1);      }      int k=strlen(s);      dp[k]=1;      //cout<<k<<endl;      for(i=1;i<=k;i++)      {          dp[k-i]=root.query(s,k-i);      }        //for(i=0;i<k;i++)       // cout<<dp[i]<<" ";       printf("Case %d: ",cas++);       printf("%d\n",dp[0]);  }}

0 0
原创粉丝点击