HDU1251 统计难题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37404150/article/details/78505329

第一次见到 以输入空行结束 学到了

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int trie[400001][26],len,root,tot,sum[400001]; 
char s[11];//这里的s设为全局变量,插入和查询都是用的这个s 
void insert()
{
    len=strlen(s);
    root=0;
    for(int i=0;i<len;i++)
    {
        int id=s[i]-'a';
        if(!trie[root][id]) trie[root][id]=++tot;  //如果root子节点不含id所表示的字母,那么给trie[root][id]编号 
        sum[trie[root][id]]++;//sum表示以trie[root][id]为前缀的单词出现的的次数 
        root=trie[root][id];//更改根节点,继续向下 
    }
}
int search()
{
    root=0;
    len=strlen(s);//此时的s为要查询的前缀 
    for(int i=0;i<len;i++)
    {
        int id=s[i]-'a';
        if(!trie[root][id]) return 0;
        root=trie[root][id];
    }
    return sum[root];
}
int main()
{
    while(gets(s)&&strcmp(s,"")!=0){
    	insert();
	}
	while(cin>>s){
		printf("%d\n",search());
	}
}

猜你喜欢

转载自blog.csdn.net/qq_37404150/article/details/78505329