简单的trie树题,利用类似前缀和的思想,每经过一个点就+1,在哪个点停在来就返回那个点的值,就做完了。
还有就是gets如果只读换行,那么第一个字符是null,这个非常好用
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#define int long long
using namespace std;
int trie[10005*55][28],n,m,color[10005*55],k=1;
char a[55];
void inse(char s[])
{
int p=0,len;
len=strlen(s+1);
for(int i=1;i<=len;i++)
{
if(!trie[p][s[i]-'a'])
{
trie[p][s[i]-'a']=k++;
}
p=trie[p][s[i]-'a'];
color[p]++;
}
}
int fin(char s[])
{
int p=0,len;
len=strlen(s+1);
for(int i=1;i<=len;i++)
{
if(!trie[p][s[i]-'a'])return 0;
p=trie[p][s[i]-'a'];
}
return color[p];
}
signed main()
{
while(gets(a+1))
{
if(a[1]==NULL)break;
inse(a);
}
while(gets(a+1))
{
printf("%d\n",fin(a));
}
}