1 #include<stdio.h> 2 #include<string.h> 3 const int maxnode = 500000; 4 const int sigma_size = 26; 5 const int N = 300010; 6 const int mod = 20071027; 7 int ch[maxnode][sigma_size]; 8 int val[maxnode]; 9 int sz; 10 int idx(char c) { return c - 'a';} 11 12 void Trie_init() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); } 13 14 void insert(char *s, int v) { 15 int u = 0; 16 for(int i = 0; s[i]; ++i) { 17 int c = idx(s[i]); 18 if(!ch[u][c]) { 19 memset(ch[sz], 0, sizeof(ch[sz])); 20 val[sz] = 0; 21 ch[u][c] = sz++; 22 } 23 u = ch[u][c]; 24 } 25 val[u] = v; 26 } 27 28 int num, dp[N], begin; 29 void query(char *s) { 30 int u = 0; 31 for(int i = 0; s[i]; ++i) { 32 int c = idx(s[i]); 33 if(ch[u][c]) { 34 u = ch[u][c]; 35 if(val[u]) { 36 num = (num + dp[begin + i + 1]) % mod; 37 } 38 } 39 else return; 40 } 41 } 42 43 int main() { 44 char s1[N]; 45 int kase = 0; 46 while(scanf("%s", s1) != EOF) { 47 Trie_init(); 48 int m; 49 char s2[110]; 50 scanf("%d", &m); 51 while(m--) { 52 scanf("%s", s2); 53 insert(s2, 1); 54 } 55 int len = strlen(s1); 56 dp[len] = 1; 57 for(int i = len - 1; i >= 0; --i) { 58 num = 0; 59 begin = i; 60 query(&s1[i]); 61 dp[i] = num; 62 } 63 printf("Case %d: %d\n",++kase, dp[0]); 64 } 65 return 0; 66 }