Trie
#include <bits/stdc++.h>
#define maxn 100010
#define INF (int)(1e9)
#define MOD 20071027
#define maxnode 500010
#define sigma_size 30
typedef long long ll;
using namespace std;
int dp[maxnode];
char str[maxnode], word[110];
struct Trie {
int ch[maxnode][sigma_size];
int val[maxnode];//单词权值
int sz;
void init() {
memset(ch[0], 0, sizeof(ch[0]));
sz = 1;
}
int idx(char c) {
return c - 'a';
}
void Insert(char *s, int v) {
int u = 0;
for (int i = 0; s[i]; ++ i) {
int c = idx(s[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;
}
void Query(char *s, int p) { //查找前缀个数
int cur = 0;
for (int i = 0; s[i]; ++ i) {
int c = idx(s[i]);
if (!ch[cur][c]) break;
if (val[ch[cur][c]] == -1) {
//查找到单词
}
cur = ch[cur][c];
}
}
}tx;
int main() {
#ifdef LOCAL
freopen("data.in", "r", stdin);
#endif // LOCAL
int now = 0;
while (scanf("%s", str) != EOF) {
memset(dp, 0, sizeof(dp));
int n;
tx.init();
scanf("%d", &n);
for (int i = 0; i < n; ++ i) {
scanf("%s", word);
tx.Insert(word, -1);
}
dp[strlen(str)] = 1;
for (int i = strlen(str)-1; i >= 0; -- i) {
char *p = str + i;
//puts(p);
tx.Query(p, i);
}
printf("Case %d: %d\n", ++now, dp[0]%MOD);
}
}