[模板][字符串] Trie树
作者:互联网
题面
https://oi-wiki.org/string/trie/#_5
所以感觉Trie树就是通过重复利用相同区间做到减小时间和空间的复杂度效果
不要乱搞
// 虽然好像并不是个 Trie 题但是可以用来当 Trie 板子(雾)
// 就比普通 Trie 多了个计数器
# include <iostream>
# include <cstdio>
# include <cstring>
# include <string>
# include <map>
# define MAXN 500050
using namespace std;
int trie[MAXN][26], cntT; // cntT 为下一个节点位置,乱搞会GG
bool isEnd[MAXN]; // 记录某个位置是不是结尾节点
void Insert(string s){
int len = s.length(), p = 1; // p 是一个初始时指向根节点,最后指向末尾节点的指针。
for(int i = 0, ch; i < len; i++){ // 注意严格小于以及 i = 0
ch = s[i] - 'a';
if(!(trie[p][ch])){
trie[p][ch] = ++cntT;
}
p = trie[p][ch]; // 更新结尾位置
}
isEnd[p] = 1; // 记录当前节点是结尾节点
}
bool Search(string s){
int len = s.length(), p = 1;
for(int i = 0, ch; i < len; i++){ // 注意严格小于以及 i = 0
ch = s[i] - 'a';
if(!p){
return 0;
} // 节点不存在
p = trie[p][ch]; // 向下查找
}
return isEnd[p];
}
map<string, bool>mp;
int main(){
memset(trie, 0, sizeof(trie));
memset(isEnd, 0, sizeof(isEnd));
int n, m;
cin>>n;
string s;
for(int i = 1; i <= n; i++){
cin>>s;
Insert(s);
}
cin>>m;
for(int i = 1; i <= m; i++){
cin>>s;
bool ans = Search(s);
if(ans){
if(mp[s]){
cout<<"REPEAT"<<endl;
}
else{
cout<<"OK"<<endl;
mp[s] = 1;
}
}
else{
cout<<"WRONG"<<endl;
}
}
return 0;
}
标签:ch,Trie,isEnd,int,trie,字符串,include,节点,模板 来源: https://www.cnblogs.com/Foggy-Forest/p/13387315.html