#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int MOD = 1337377;
const int N = 4e3 + 5;
const int M = 3e5 + 5;
const int MX = 4e5 + 5;
void add(int& a, int b) {
a += b;
if (a >= MOD) a -= MOD;
}
struct Node {
int nxt[26];
bool mark = false;
Node() {
memset(nxt, -1, sizeof nxt);
}
};
int sz;
Node trie[MX];
void addString(const string& s) {
int v = 0;
for (char ch : s) {
int c = ch - 'a';
if (trie[v].nxt[c] == -1) {
trie[v].nxt[c] = ++sz;
}
v = trie[v].nxt[c];
}
trie[v].mark = true;
}
int n, m;
string s;
string t[N];
int dp[M]; // dp[i] = Số cách tách đoạn [1, i]
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> s;
m = s.size();
s = ' ' + s;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> t[i];
addString(t[i]);
}
dp[0] = 1;
for (int i = 0; i < m; i++) {
int v = 0;
for (int j = i + 1; j <= m; j++) { // O(100)
int c = s[j] - 'a';
if (trie[v].nxt[c] == -1) break;
v = trie[v].nxt[c];
if (trie[v].mark) add(dp[j], dp[i]); // đoạn [i + 1, j] phải là một từ thuộc tập từ đã cho
}
}
cout << dp[m] << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE1PRCA9IDEzMzczNzc7CmNvbnN0IGludCBOID0gNGUzICsgNTsgCmNvbnN0IGludCBNID0gM2U1ICsgNTsgCmNvbnN0IGludCBNWCA9IDRlNSArIDU7IAoKdm9pZCBhZGQoaW50JiBhLCBpbnQgYikgewoJYSArPSBiOyAKCWlmIChhID49IE1PRCkgYSAtPSBNT0Q7IAp9CgpzdHJ1Y3QgTm9kZSB7CglpbnQgbnh0WzI2XTsgCglib29sIG1hcmsgPSBmYWxzZTsgCgoJTm9kZSgpIHsKCQltZW1zZXQobnh0LCAtMSwgc2l6ZW9mIG54dCk7IAoJfQp9OyAKCmludCBzejsgCk5vZGUgdHJpZVtNWF07IAoKdm9pZCBhZGRTdHJpbmcoY29uc3Qgc3RyaW5nJiBzKSB7CglpbnQgdiA9IDA7IAoJZm9yIChjaGFyIGNoIDogcykgewoJCWludCBjID0gY2ggLSAnYSc7IAoJCWlmICh0cmllW3ZdLm54dFtjXSA9PSAtMSkgewoJCQl0cmllW3ZdLm54dFtjXSA9ICsrc3o7CgkJfQoJCXYgPSB0cmllW3ZdLm54dFtjXTsgCgl9Cgl0cmllW3ZdLm1hcmsgPSB0cnVlOyAKfQoKaW50IG4sIG07IApzdHJpbmcgczsgIApzdHJpbmcgdFtOXTsgCgppbnQgZHBbTV07IC8vIGRwW2ldID0gU+G7kSBjw6FjaCB0w6FjaCDEkW/huqFuIFsxLCBpXQoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCQoJY2luID4+IHM7IAoJbSA9IHMuc2l6ZSgpOyAgCglzID0gJyAnICsgczsgICAKCgljaW4gPj4gbjsgCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKCQljaW4gPj4gdFtpXTsgCgkJYWRkU3RyaW5nKHRbaV0pOyAKCX0KCglkcFswXSA9IDE7IAoJZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsgCgkJaW50IHYgPSAwOyAgCgkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDw9IG07IGorKykgeyAvLyBPKDEwMCkKCQkJaW50IGMgPSBzW2pdIC0gJ2EnOyAgCgkJCWlmICh0cmllW3ZdLm54dFtjXSA9PSAtMSkgYnJlYWs7IAoJCQl2ID0gdHJpZVt2XS5ueHRbY107IAoJCQlpZiAodHJpZVt2XS5tYXJrKSBhZGQoZHBbal0sIGRwW2ldKTsgLy8gxJFv4bqhbiBbaSArIDEsIGpdIHBo4bqjaSBsw6AgbeG7mXQgdOG7qyB0aHXhu5ljIHThuq1wIHThu6sgxJHDoyBjaG8KCQl9Cgl9CgoJY291dCA8PCBkcFttXSA8PCAnXG4nOyAKfQ==