#Trie Trie字典树

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int trie[100050][26];
int num[1000010];
int pos=1;//新建节点时用的序数,也就是已有的节点的序数(1 2 3...p);注意pos必须是1,0的话相当于放弃第一个节点
void Insert(string str){
	int c=0;//c代表字典序,pos 
	for(int i=0;i<str.size();i++){//遍历字符串 
		int n=str[i]-'a';//字符转化为数值; 
		if(trie[c][n]==0)//第c行里没有出现过n的时候 字典里没有出现的时候 
			trie[c][n]=pos++;//用pos新建节点(第c行的第n节点的下一个节点位置是pos) 
		c=trie[c][n];//c变为第c行的第n个数,模拟字典遍历 
		++num[c];//c(某节点,某前缀的出现次数)的出现次数+1;在这里出现就是记录前缀出现次数 
	} 
//		num[c]++;//c的出现次数+1; //在这里出现就是记录字符串出现次数。 
}
int Find(string str){
	int c=0;
	for(int i=0;str[i];i++){
		int n=str[i]-'a';
		if(trie[c][n]==0)//trie[c][n]是位置,为0代表没有; 
			return 0;
		c=trie[c][n];
	}
	return num[c];
}
int main(){
	memset(num,0,sizeof(num)); 
	string str;
	while(getline(cin,str)){//不断读入,插入; 
		if(!str.size()) break;
		Insert(str);//插入函数; 
	}
	while(getline(cin,str)) cout<<Find(str)<<endl;
	return 0;
}
原文地址:https://www.cnblogs.com/yuanyulin/p/14026718.html