/*
题意:给定一些字符串,然后再给你一些前缀字符串,问你前缀字符串在之前给
的那些字符串里面出现的次数。
思路:trie树。
关键:与一般trie树的区别:一般trie树是把整个串的信息保存到这个
串的最后一个字母,但本题求的是前缀串出现的次数,所以所以每个
结点的信息应该保持在自己的value上,而不是保持到最后一个字母里
*/
#include<iostream>
#include<cstring>
using namespace std;
const int MAXN=500000;
struct Node //结构体:每个结点的信息
{
int value;//结点的值
int child[26]; //结点的下一层[他的孩子]
Node() //构造函数初始化
{
value=0;
memset(child,0,sizeof(child));
}
};
Node trie[MAXN];
int trieN=0;
void Insert(char s[]) //插入过程[构造trie树]
{
int x=0;
for(int i=0;i<strlen(s);i++)
{
int d=s[i]-'a';
if(trie[x].child[d]==0)
{
trie[++trieN]=Node();
trie[x].child[d]=trieN;
}
x=trie[x].child[d];
trie[x].value++;//[关键:与一般trie树的区别:一般trie树是把整个串的信息保存到这个
} //串的最后一个字母,但本题求的是前缀串出现的次数,所以所以每个
} //结点的信息应该保持在自己的value上,而不是保持到最后一个字母里]
int Serch(char s[]) //查询过程
{
int x=0;
for(int i=0;i<strlen(s);i++)
{
int d=s[i]-'a';
if(trie[x].child[d]==0)
{
return 0;
}
x=trie[x].child[d];
}
return trie[x].value;
}
int main()
{
char s[15];
while(gets(s)&&s[0])//输入单词表
{
Insert(s);
}
while(cin>>s) //输入前缀串
{
cout<<Serch(s)<<endl;
}
return 0;
}
暑假- Trie树-(C - 统计难题)
最新推荐文章于 2024-09-13 22:15:41 发布