难题统计
解题思路:字典树模板题,记录下结束的节点出现的次数,然后匹配成功输出出现次数即可
Code:
#include <iostream>
#include <cstdio>
#include<cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int N = 1e6+10;
char str[11];
int tree[N][26],vis[N],cnt = 1;
void insert(string s){
int p=0;
for(int i=0;s[i];i++){
int x=s[i]-'a';
if(!tree[p][x]) tree[p][x] = ++cnt;
p = tree[p][x];
vis[p]++; //记录节点出现次数
}
}
int search(string s){
int p=0;
for(int i=0;i<s[i];i++){
int c=s[i]-'a';
if(!tree[p][c]) return 0;
p=tree[p][c];
}
return vis[p];
}
int main(){
while(gets(str)){
if(str[0]==NULL) break; //看了个hxd的博客,要是空行或者\n的话,自动转换成NULL
insert(str);
}
while(~scanf("%s",&str)){
int ans=search(str);
printf("%d\n",ans);
}
return 0;
}