zoukankan      html  css  js  c++  java
  • Trie模板 UVALive 3942 Remember the Word

    使用Tire进行DP的递推,f[i+len]+=f[i] 若S[i+1..len]为字典中的元素。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <queue>
     4 
     5 const long long maxnode    = 4010*100;
     6 const long long SIGMA_SIZE = 26;
     7 const long long maxlen     = 100;
     8 const long long maxn       = 300010;
     9 const long long MOD        = 20071027;
    10 
    11 using namespace std;
    12 
    13 char s[maxn];
    14 int f[maxn];
    15 
    16 struct Trie
    17 {
    18     int ch[maxnode][SIGMA_SIZE];
    19     int val[maxnode];
    20     int size;
    21     Trie(){clear();}
    22     void clear(){
    23         size=1;
    24         memset(ch[0],0,sizeof(ch[0]));
    25         memset(val,0,sizeof(val));
    26     }
    27     int index(char t){return t-'a';};
    28     int buildNewNode(int u){
    29         memset(ch[size],0,sizeof(ch[size]));
    30         val[size]=u;
    31         return size++;
    32     }
    33     void insert(char *s){
    34         int u = 0;
    35         for(;*s;s++){
    36             int c = index(*s);
    37             if(!ch[u][c])
    38                 ch[u][c]=buildNewNode(0);
    39             u=ch[u][c];
    40         }
    41         val[u]=1;//val[u]=v
    42     }
    43     void find(int i,char *s){
    44         int u=0,len=0;
    45         for(;*s;s++){
    46             int c = index(*s);
    47             if(ch[u][c]){
    48                 len++;
    49                 u=ch[u][c];
    50                 f[i+len]=(val[u]*f[i]+f[i+len])%MOD;
    51                 //if(val[u]){find an end }
    52             }
    53             else
    54                 break;
    55         }
    56 
    57     }
    58 };
    59 
    60 Trie trie;
    61 
    62 int main()
    63 {
    64     int CaseNum = 0;
    65     while(scanf("%s",s)!=EOF){
    66         int n,len=strlen(s);
    67         memset(f,0,sizeof(f));f[0]=1;
    68         trie.clear();
    69 
    70         scanf("%d",&n);
    71         for(int i=0;i<n;i++){
    72             char key[110];
    73             scanf("%s",key);
    74             trie.insert(key);
    75         }
    76 
    77         for(int i=1;i<=len;i++)
    78             trie.find(i-1,s+i-1);
    79 
    80         printf("Case %d: %d
    ",++CaseNum,f[len]);
    81 
    82     }
    83     return 0;
    84 }
    View Code
  • 相关阅读:
    很多Python新手教程
    NYOJ 58 步数最少 【BFS】
    页面背景图像的代码
    1001. 杀死吸引力(3n+1)猜想 (15)(ZJUPAT 数学)
    使用JasperReport+iReport进行Web报表开发
    Android学习路径——Android的四个组成部分activity(一)
    1001
    android 拍照注意问题
    springMVC注解优化
    JDBC batch批处理Statement executeBatch 具体解释
  • 原文地址:https://www.cnblogs.com/lijianlin1995/p/3823582.html
Copyright © 2011-2022 走看看