白书P209
// test.cpp : 定义控制台应用程序的入口点。
//
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <set>
#include <string>
#include <map>
using namespace std;
typedef long long ll;
const int MAXN = 400000 + 10;
const int INF = 1e9 + 7;
const int MODE = 20071027;
struct node {
node *next[26];
bool flag = false;
int len = 0;
node() {
memset(next, NULL, sizeof(next));
}
};
node *root=new node();
node *p = new node();
void del(node *rt) {
if (rt == NULL)
return;
for (int i = 0; i < 26; i++) {
if (!rt->next[i]) {
del(rt->next[i]);
}
}
delete rt;
}
void insert(char *s) {
int i, k;
for (p = root, i = 0; s[i]; i++) {
k = s[i] - 'a';
if (p->next[k] == NULL)
p->next[k] = new node();
p = p->next[k];
p->len = i+1;
}
p->flag = true;
}
vector<int> search(char *s) {
int i, k;
int cnt = 0;
vector <int> res;
for (p = root, i = 0; s[i]; i++) {
k = s[i] - 'a';
if (p->next[k] == NULL) {
break;
}
p = p->next[k];
if (p->flag) {
res.push_back(p->len);
}
}
return res;
}
char s[MAXN];
ll dp[MAXN];
int main() {
int cas = 1;
while (scanf("%s", s) != EOF) {
int len = strlen(s);
int n;
scanf("%d", &n);
while (n--) {
char temp[110];
scanf("%s", temp);
insert(temp);
}
memset(dp, 0, sizeof(dp));
dp[len] = 1;
for (int i = len - 1; i >= 0; i--) {
char *t = s + i;
vector <int> res = search(t);
for (int k = 0; k < res.size(); k++) {
dp[i] = (dp[i] + dp[i + res[k]]) % MODE;
}
}
printf("Case %d: %lld\n", cas++, dp[0]);
del(root);
root = new node();
}
}