Repository
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 7006 Accepted Submission(s): 2210
Problem Description
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.
Input
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.
Output
For each query, you just output the number of the merchandises, whose names contain the search string as their substrings.
Sample Input
20 ad ae af ag ah ai aj ak al ads add ade adf adg adh adi adj adk adl aes 5 b a d ad s
Sample Output
0 20 11 11 2
Source
Recommend
思路容易想到把子串一个个加进去 就是问题是abab里面查询ab会有两个 但是输出一个就好了
我们怎么解决呢?就是利用Insert进行一个ID的比较 代表插入的次数 不同也就是需要计数
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
#define dbg(x) cout<<#x<<" = "<< (x)<< endl
const int MAX_N = 2000024;
int tree[MAX_N][30];
int cnt[MAX_N],ID[MAX_N];
int tot;
void Insert(string str,int IDD){
int len = str.length();
int root = 0;
for(int i= 0;i<len;++i){
int id = str[i]-'a';
if(!tree[root][id]) tree[root][id] = ++tot;
root = tree[root][id];
if(ID[root]!=IDD){
ID[root] = IDD;
cnt[root]++;
}
}
}
int Find(string str){
int len = str.length();
int root = 0;
for(int i = 0;i<len;++i){
int id = str[i]-'a';
if(!tree[root][id]) return 0;
root = tree[root][id];
}
return cnt[root];
}
int main(){
int n,m;
cin >> n;
string str;
int num = 1;
while(n--){
cin >> str;
int len = str.length();
for(int i = 0;i<len;i++){
Insert(str.substr(i,len-i),num);
//dbg(str.substr(i,len-i));
//dbg(i+1);
}
num++;
}
cin >> m;
while(m--){
cin >> str;
cout << Find(str)<<endl;
}
return 0;
}