1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 const int N = 510*505; 6 const int M = 27; 7 8 9 map<string,int>Map; 10 struct Trie 11 { 12 int next[N][M],fail[N],end[N]; 13 int root,L; 14 int newnode() 15 { 16 for(int i = 0; i < 26; i++) 17 next[L][i] = -1; 18 end[L++] = -1; 19 return L - 1; 20 } 21 void init() 22 { 23 L = 0; 24 root = newnode(); 25 } 26 void insert(string s,int id) 27 { 28 int len = s.size(); 29 int now = root; 30 for(int i = 0; i < len; i++) 31 { 32 if(next[now][s[i]-‘a‘] == -1) 33 next[now][s[i] - ‘a‘] = newnode(); 34 now = next[now][s[i] - ‘a‘]; 35 } 36 end[now] = id; 37 } 38 void build() 39 { 40 queue<int>Q; 41 fail[root] = root; 42 for(int i = 0; i < 26; i++) 43 { 44 if(next[root][i] == -1) 45 next[root][i] = root; 46 else 47 { 48 fail[next[root][i]] = root; 49 Q.push(next[root][i]); 50 } 51 } 52 while(!Q.empty()) 53 { 54 int now = Q.front(); 55 Q.pop(); 56 for(int i = 0; i < 26; i++) 57 { 58 if(next[now][i] == -1) 59 next[now][i] = next[fail[now]][i]; 60 else 61 { 62 fail[next[now][i]] = next[fail[now]][i]; 63 Q.push(next[now][i]); 64 } 65 } 66 } 67 } 68 int num[1000]; 69 void query(char buf[],int n,int mm[]) 70 { 71 for(int i = 1; i <= n; i++) 72 num[i] = 0; 73 int len = (int)strlen(buf); 74 int now = root; 75 for(int i = 0; i < len; i++) 76 { 77 now = next[now][buf[i]-‘a‘]; 78 int temp = now; 79 while( temp != root ) 80 { 81 if( end[temp] != -1) 82 num[end[temp]]++; 83 temp = fail[temp]; 84 } 85 } 86 for(int i = 1; i <= n; i++) 87 printf("%d\n",num[mm[i]]); 88 } 89 }; 90 91 char buf[1000100]; 92 Trie ac; 93 94 void solve() 95 { 96 ac.init(); 97 int n, l = 0; 98 scanf("%d",&n); 99 scanf("%s",buf); 100 Map.clear(); 101 int twice[1005]; 102 memset(twice,0,sizeof(twice)); 103 for(int i = 1; i <= n; i++) 104 { 105 string ss; 106 cin>>ss; 107 int c = Map[ss]; 108 if(c == 0) 109 { 110 Map[ss] = ++l; 111 ac.insert(ss,l); 112 } 113 twice[i] = Map[ss]; 114 //int tmp = Map[ss]; 115 116 } 117 ac.build(); 118 119 ac.query(buf,n,twice); 120 } 121 122 int main(void) 123 { 124 int t,cnt = 0; 125 scanf("%d",&t); 126 while(t--) 127 { 128 printf("Case %d:\n",++cnt); 129 solve(); 130 } 131 132 return 0; 133 }
时间: 2024-10-09 04:21:12