LA-3942 (字典树模板)

来源:互联网 发布:sql语句group by的用法 编辑:程序博客网 时间:2024/06/07 05:31


  分析:字典树+DP,当做字典树模板来做了。

#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <cmath>using namespace std;string m,s[4001];const int maxnode=400000,tot_size=26;int num,n,f[300001];struct Trie{    int ch[maxnode][tot_size];    int val[maxnode];    int tot;    void build()    {        tot=1;        memset(ch[0],0,sizeof(ch[0]));    }    int idx(char c) { return c - 'a'; }    void insert(string s,int v)    {        int u=0,n=s.length();        for(int i=0;i < n;i++)        {            int c=idx(s[i]);            if(!ch[u][c])            {                memset(ch[tot],0,sizeof(ch[tot]));                val[tot]=0;                ch[u][c]=tot++;            }            u=ch[u][c];        }        val[u]=v;    }    int find(string s,int now)    {        int u=0,n=s.length(),ans=0;        for(int i=0;i < n;i++)        {            int c=idx(s[i]);            if(!ch[u][c]) return ans;            u=ch[u][c];            if(val[u]) ans=(ans+f[now+val[u]])%20071027;        }        return ans;    }} tree;int main(){    cin.sync_with_stdio(false);    while(cin>>m)    {        cin>>n;        tree.build();        int Max=0;        for(int i=1;i <= n;i++)        {            cin>>s[i];            tree.insert(s[i],int(s[i].length()));            Max=max(Max,int(s[i].length()));        }        memset(f,0,sizeof(f));        int l=m.length();        f[l]=1;        for(int i=l-1;i >= 0;i--)         f[i]=(f[i]+tree.find(m.substr(i,min(Max,l-i)),i))%20071027;        cout<<"Case "<<++num<<": "<<f[0]<<endl;    }}


0 0
原创粉丝点击