统计难题 HDU - 1251

Miku

字典树模板题级别

字典树是啥,就是一颗从根走到底就找到了一个单词的树

非常好理解

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<istream>
using namespace std;
int n;
string s;
struct t{
   int ne[28];
   int cnt;
}tr[400001];
int p;
int l;
int x;
int po;
void add(){
   //cout<<s<<" "<<l<<endl;
   p=0;
   for(int i=0;i<l;++i){
   	x=s[i]-'a'+1;//这么干就不会有0了 
   	if(!tr[p].ne[x]){//没有就建 
   		po++;
   		tr[p].ne[x]=po;		
   	}
   	p=tr[p].ne[x];
   	tr[p].cnt++;//被经过次数即为前缀数 
   }
   return ;
}
int query(){
   p=0;
   for(int i=0;i<l;++i){
   	x=s[i]-'a'+1;
   	if(!tr[p].ne[x]){ 
   		return 0;
   	}else{
   		p=tr[p].ne[x];
   	}
   }
   return tr[p].cnt;
}

int main(){
   while(getline(cin,s)){
   	l=s.length();
   	if(l==0)
   	break;
   	add();
   }	
   while(getline(cin,s)){
   	l=s.length();
   	cout<<query()<<endl;;
   }
   return 0;
}

posted @ 2020-08-03 17:32  Simex  阅读(63)  评论(0编辑  收藏  举报