#include<bits/stdc++.h> using namespace std; #define IO ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0) const int maxnode=700000+5; const int sigma_size=26; const int mod=20071027; char tmp[200+5]; char st[maxnode]; int dp[maxnode]; int ch[maxnode][sigma_size]; int val[maxnode]; struct Trie { int sz; Trie() { sz=1;memset(ch[0],0,sizeof(ch[0])); } int idx(char c){return c-'a';} void Insert(char *s,int v) { int u=0,n=strlen(s); for(int i=0;i<n;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; } int Find(char *s,int pos) { int ans=0; int u=0,n=strlen(s); for(int i=pos;i<n&&i<=pos+100;i++){ int c=idx(s[i]); if(!ch[u][c]) return ans; u=ch[u][c]; if(val[u]) ans=(dp[i+1]+ans)%mod; } return ans; } }; Trie T; int32_t main() { int n,cas=0; while(scanf("%s",st)==1){ T=Trie(); scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%s",tmp); T.Insert(tmp,1); } int len=strlen(st); dp[len]=1; for(int i=len-1;i>=0;i--){ dp[i]=T.Find(st,i); } printf("Case %d: %d ",++cas,dp[0]); } }