专栏文章

P2580于是他错误的点名开始了 trie树

题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip1kr7h
此快照首次捕获于
2025/12/03 04:39
3 个月前
此快照最后确认于
2025/12/03 04:39
3 个月前
查看原文
代码:
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
char s[10101010];
int m;
int ch[1010101][26];
int idx;
int cnt[101011111];
void insert(char s[]){
	int p=0;
	for(int i=0;s[i];i++){
		int x=s[i]-'a';
		if(!ch[p][x])ch[p][x]=++idx;
		p=ch[p][x];
	}
	cnt[p]++;
}
int query(char s[]){
	int p=0;
	for(int i=0;s[i];i++){
		int x=s[i]-'a';
		if(!ch[p][x])return 0;
		p=ch[p][x];
	}
	if(cnt[p]>0){
		int anss=cnt[p];
		cnt[p]=-1;
		return anss;
	}
	return cnt[p];
}
signed main(){
//	ios::sync_with_stdio(0);
//	cin.tie(0),cout.tie(0);
	cin>>n;
	while(n--){
		scanf("%s",s);
		insert(s);
	}
	cin>>m;
	while(m--){
		scanf("%s",s);
		int op=query(s);
		if(op>0){
			printf("OK\n");
		}
		else if(op==-1){
			printf("REPEAT\n");
		}
		else if(op==0){
			printf("WRONG\n");
		}
	}
	
	
	
	return 0;
}
insert函数用来将班上人名插入树中。
query函数用来查询点到的人名。
如果第一次点到了办理存在的人,就把cnt[p]标记为-1,这样第二次重复点到就返回-1,直接输出REPEAT。
注意要将数组开大,不然会RE。

评论

0 条评论,欢迎与作者交流。

正在加载评论...