传送门:统计难题
分析:Trie树入门题,随便写写练下手感,统计每个节点被多少单词经过就可以了。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#define LL long long
#define N 500010
using namespace std; char s[];
struct Trie
{
int cnt[N],child[N][];
int L,root;
int newnode()
{
memset(child[L],,sizeof(child[L]));
return L++;
}
void init()
{
L=;
memset(cnt,,sizeof(cnt));
root=newnode();
}
void insert(char *s)
{
int now=root;
for(int i=;s[i];i++)
{
int id=s[i]-'a';
if(!child[now][id])
child[now][id]=newnode();
now=child[now][id];
cnt[now]++;
}
}
int query(char *s)
{
int now=root;
for(int i=;s[i];i++)
{
int id=s[i]-'a';
if(!child[now][id])return ;
now=child[now][id];
}
return cnt[now];
}
}trie;
int main()
{
trie.init();
while(gets(s))
{
if(strlen(s)==)break;
trie.insert(s);
}
while(scanf("%s",s)==)printf("%d\n",trie.query(s));
}