LA3942_RememberTheWord

#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=a;i<b;i++)
using namespace std;


const int maxnode = 400000 + 5;
const int sigama_size = 26;
const int maxn = 300000 + 3;
const int MOD = 20071027;
char s[maxn];


struct Trie{
    int ch[maxnode][sigama_size];
    int val[maxnode];
    int sz;
    void clear(){
        sz = 1;
        memset(ch[0], 0, sizeof(ch[0]));
    }
    int idx(char c){
        return c - 'a';
    }

    void insert(char *s, int v){
        int u = 0, n = strlen(s);
        for(int i = 0; i < n; i++){
            int c = idx(s[i]);
            if(!ch[u][c]){  //the node does not exist
                memset(ch[sz], 0, sizeof(ch[sz]));
                ch[u][c] = sz;
                val[sz] = 0;
                sz++;
            }
            u = ch[u][c];
        }
        val[u] = v;
    }

    bool query(char *s){
        int u = 0, n = strlen(s);
        for(int i = 0; i < n; i++){
            int c = idx(s[i]);
            if(!ch[u][c]) return false;
            else u = ch[u][c];
        }
        return val[u];
    }

    void query2(char* s, vector<int>&layers){
        int u = 0, n = strlen(s);
        for(int i = 0; i < n; i++){
            int c = idx(s[i]);
            if(!ch[u][c]) return ;
            if(val[ch[u][c]]){
                layers.push_back(i);
            }
            u = ch[u][c];
        }
    }
};

Trie trie;


// d[i] = sum{d[i+len(x)] | x is prefix of S[i...L]}
int solve(char* s)
{
    int n = strlen(s);
    int d[n+1];
    memset(d, 0, sizeof(d));
    d[n] = 1;
    for(int i = n - 1; i >= 0; i--){
        vector<int>layers;
        trie.query2(s + i, layers);
        for(int j = 0; j < layers.size(); j++)
            d[i] = (d[i] + d[i+layers[j]+1]) % MOD;
    }
    return d[0];
}

int main()
{
    int kase = 0, n;
    while(scanf("%s%d", s, &n) == 2){
        trie.clear();
        while(n--){
            char word[102];
            scanf("%s", word);
            trie.insert(word, 1);
        }
        printf("Case %d: %d\n", ++kase, solve(s));
    }
    return 0;
}

 

posted on 2019-03-11 16:42  nbsanshi  阅读(104)  评论(0)    收藏  举报

导航