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

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

题目本体

观察题目,很容易发现需要使用\(Trie\)树。

然后非常轻松的写出建树的代码。

需要注意的是,每一个字符串的长度是50,注意数组区间,不要\(RE\)

以及,在判断的时候,要注意当老师念了完整名字的一部分的时候应该输出\(WRONG\)

虽然即便不这么写也不会有什么问题

以及\(AC\)代码

#include<bits/stdc++.h>
using namespace std;

int n,m,cnt;
char name[50001],report[500001],vis[500001];
int f[500001][30];
int cd[500001];

void add (char c[]){
	int len=strlen(c+1);
	int t=0;
	for(int i=1;i<=len;i++){
		if(!f[t][c[i]-'a']) f[t][c[i]-'a']=++cnt;
		t=f[t][c[i]-'a'];
	}
	cd[t]=1;
}

void check(char c[]){
	int len=strlen(c+1);
	int t=0;
	for(int i=1;i<=len;i++){
		t=f[t][c[i]-'a'];
		if(!t){
			printf("WRONG\n");
			return;
		}
		
	}
	if(!vis[t]&&cd[t]){ printf("OK\n");vis[t]=1;return;}
	if(!cd[t]) {printf("WRONG\n");return ;}
	if(vis[t]) {printf("REPEAT\n");return;}
		
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%s",name+1);
		add(name);
	}
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%s",report+1);
		check(report);
	}
	return 0;
}

posted @ 2020-09-29 17:05  Luo_Feng_Han  阅读(149)  评论(0编辑  收藏  举报