其他分享
首页 > 其他分享> > [模板][字符串] Trie树

[模板][字符串] 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