#include #define rep(i,n) for (int i = 0; i < (int)(n); i ++) #define irep(i,n) for (int i = (int)(n) - 1;i >= 0;--i) using namespace std; using ll = long long; using PL = pair; using P = pair; constexpr int INF = 1000000000; constexpr long long HINF = 1000000000000000; constexpr long long MOD = 1000000007;// = 998244353; constexpr double EPS = 1e-4; constexpr double PI = 3.14159265358979; template struct Trie { struct Node { vector child,accept; int c; int common; Node(int c):c(c),common(0) { child.assign(char_size,0); } }; vector tree; int root = 0; Trie() { tree.emplace_back(0); } void insert(const string &s,int id) { int node_id = 0; for (int i = 0; i < (int)s.size(); ++i) { int c = s[i] - base; int &next_id = tree[node_id].child[c]; if (next_id == 0) { next_id = (int)tree.size(); tree.emplace_back(c); } ++tree[node_id].common; node_id = next_id; } ++tree[node_id].common; tree[node_id].accept.push_back(id); } // insert s to Trie void insert(const string &s) { insert(s,tree[0].common); } // return the number of s in trie int search(const string &s,bool predix = false) { int node_id = 0; for (int i = 0;i < (int)s.size(); ++i) { int c = s[i] - base; int &next_id = tree[node_id].child[c]; if (next_id == 0) return 0; node_id = next_id; } return (int)tree[node_id].accept.size(); } }; int main() { string s; cin >> s; int M; cin >> M; Trie<26,'A'> tr; rep(i,M) { string c; cin >> c; tr.insert(c); } ll ans = 0; rep(i,s.size()) { for (int j = 1; (j <= 10 && i + j <= (int)s.size()); ++j) { ans += tr.search(s.substr(i,j)); } } cout << ans << '\n'; return 0; }