题目大意:
这之后校长任命你为特派探员,每天记录他的点名。校长会提供化学竞赛学生的人数和名单,而你需要告诉校长他有没有点错名。
解题思路:
Trie | map暴力 | 暴搜
用了Trie & map暴力
Accepted code:
Trie
#include<cstdio>
#include<cstring>
using namespace std;
int n,m;
struct node {
int cnt,son[26];
bool have;
node() {
cnt=0;
memset(son,0,sizeof son);
have=0;
}
}trie[800001];
int num=0;
void insert(char *s) {
int v,u=0,len=strlen(s);
for(int i=0;i<len;i++) {
v=s[i]-'a';
if(!trie[u].son[v])
trie[u].son[v]=++num
;
u=trie[u].son[v];
}
trie[u].have=1;
}
int find(char *s) {
int v,u=0,len=strlen(s);
for(int i=0;i<len;i++) {
v=s[i]-'a';
if(!trie[u].son[v])return 3;
u=trie[u].son[v];
}
if(!trie[u].have)return 3;
if(!trie[u].cnt) {
trie[u].cnt++;
return 1;
}
return 2;
}
int main() {
char name[100];
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%s",name),insert(name);
scanf("%d",&m);
for(int i=1;i<=m;i++) {
scanf("%s",name);
int p=find(name);
if(p==1)
puts("OK");
else if(p==2)
puts("REPEAT");
else if(p==3)
puts("WRONG");
}
return 0;
}
map暴力:
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
using namespace std;
int n,m;
map <string,int> map_;
int main() {
scanf("%d",&n);
for (int i=1;i<=n;i++) {
string s; cin>>s;
map_[s]=1;
}
scanf("%d",&m);
for (int i=1;i<=m;i++) {
string s; cin>>s;
if (map_[s]==1) map_[s]=2,puts("OK"); else
if (map_[s]==2) puts("REPEAT"); else
if (map_[s]==0) puts("WRONG");
}
}