#include <bits/stdc++.h>
using namespace std;
typedef long long ll; //一oi大佬博客讲过虚拟全树的说法,可以想像一下qwq
int trie[10000][26]; //trie[i][j]=x表示节点号i为出发点,边权为j的彼岸节点号为x
int k=1;//存储节点号的积累 //如果为0表示不存在。
int tar[10000];//记录是不是目标节点
void insert(string s){
int p=0;
int i;
for(i=0;i<(int)s.size();i++){
if(trie[p][s[i]-'a']==0){
trie[p][s[i]-'a']=k;
k++;
}
p=trie[p][s[i]-'a'];//无论上面if有没有,都要移到下一节点。
}
tar[p]=1; //标记为根节点。 //字典树中目标节点与存储的字符串一一对应。
} //也可以tar[p]++表示相同的字符串有多个
int research(string s){
int p=0;
int i;
for(i=0;i<(int)s.size();i++){
if(trie[p][s[i]-'a']==0)return 0; //如果无路可走则不存在该字符串
else{
p=trie[p][s[i]-'a'];
}
}
return tar[p]==1; //到达后还需判断是不是目标节点。
}
int main (){
insert("abc");
insert("abcd");
cout<<research("ab")<<endl;
cout<<research("abc")<<endl;
cout<<research("jiuzhe")<<endl;
return 0;
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交