字典树 c++

#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
const int maxn = 1000;
const int l = 30;
// 用数组来模拟字典树
int  trie[maxn][l];
// 记录每个字符串的终点位置 
int  ans[maxn];
// 建立树 
void insert_(char *s){
	int k = 1;
	int p = 0;
	int l = strlen(s);
	for(int i =0 ;i<l;i++){
		int c = s[i] - 'a';
		// 如果无此节点 
		if(!trie[p][c]){
			trie[p][c] = k;
			k++;
		}
		// 记录当前节点的编号, 按照循环, p 最后的值就是当前字符串最后一个字符在字典树中的节点编号数 。 
		p = trie[p][c];
	}
	// 记录终点。 
	ans[p] = 1; 
} 
// 搜索树 
int search_(char *s){
	int l = strlen(s);
	int p = 0; 
	for(int i=0;i<l;i++){
		// 开始遍历树,  
		int c = s[i] - 'a';
		// 有值的话, trie[p][c] 对应的就是该字符串的字符下标 
		// 如果没有这个节点 ,结束 
		if(!trie[p][c]) return 0;
		// 更新 p  (当前字符串的下标)
		p =  trie[p][c]; 
		// 如此遍历, 最后 p 的位置就当前字符串终点的位置, 直接判断字典树中该位置是否是终点就行了。 
	}
	return ans[p] == 1; 
} 
int main(){
	int t,q;
	cin>>t>>q;
	char str[20]; 
	// 建树 
	while(t--){
		cin>>str;
		insert_(str);
	}
	while(q--){
        cin>>str;
        if(search_(str))  cout<<"YES"<<endl;
        else			cout<<"No"<<endl;
    }
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值