Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 5167 Accepted Submission(s): 1764
When you go shopping, you can search in repository for avalible merchandises by the computers and internet. First you give the search system a name about something, then the system responds with the results. Now you are given a lot merchandise names in repository and some queries, and required to simulate the process.
There is only one case. First there is an integer P (1<=P<=10000)representing the number of the merchanidse names in the repository. The next P lines each contain a string (it's length isn't beyond 20,and all the letters are lowercase).Then there is an integer Q(1<=Q<=100000) representing the number of the queries. The next Q lines each contains a string(the same limitation as foregoing descriptions) as the searching condition.
For each query, you just output the number of the merchandises, whose names contain the search string as their substrings.
#include <bits/stdc++.h> using namespace std; #define mst(a,b) memset((a),(b),sizeof(a)) #define f(i,a,b) for(int i=(a);i<=(b);++i) const int maxn = 26; const int mod = 1e9+7; const int INF = 1e9; #define ll long long #define rush() int T;scanf("%d",&T);while(T--) struct Trie { int id; int cnt; int next[maxn]; }; int ptr=0; Trie word[1000001]; void Init(int z) { for(int i=0; i<maxn; i++) { word[z].next[i]=-1; word[z].cnt=0; } } void Insert(char*s,int len,int x) { int now=0; for(int i=0; i<len; i++) { int t=s[i]-'a'; if(word[now].next[t]==-1) { word[now].next[t]=++ptr; Init(ptr); now=ptr; } else now=word[now].next[t]; if(word[now].id!=x) //避免形如add造成的问题 { word[now].cnt++; word[now].id=x; } } } int find(char*s) { int now=0; int len=strlen(s); for(int i=0; i<len; i++) { int t=s[i]-'a'; if(word[now].next[t]==-1) return 0; now=word[now].next[t]; } return word[now].cnt; } int main() { int n,m,len; char s[21]; Init(0); scanf("%d",&n); while(n--) { scanf("%s",s); len=strlen(s); for(int i=0; i<len; i++) Insert(s+i,len-i,n+1); } scanf("%d",&m); while(m--) { scanf("%s",s); printf("%d\n",find(s)); } return 0; }