題目背景
XS中學(xué)化學(xué)競(jìng)賽組教練是一個(gè)酷愛爐石的人。
他會(huì)一邊搓?duì)t石一邊點(diǎn)名以至于有一天他連續(xù)點(diǎn)到了某個(gè)同學(xué)兩次,然后正好被路過的校長發(fā)現(xiàn)了然后就是一頓歐拉歐拉歐拉(詳情請(qǐng)見已結(jié)束比賽CON900)。
題目描述
這之后校長任命你為特派探員,每天記錄他的點(diǎn)名。校長會(huì)提供化學(xué)競(jìng)賽學(xué)生的人數(shù)和名單,而你需要告訴校長他有沒有點(diǎn)錯(cuò)名。(為什么不直接不讓他玩爐石。)
輸入輸出格式
輸入格式:
第一行一個(gè)整數(shù) n,表示班上人數(shù)。接下來 n 行,每行一個(gè)字符串表示其名字(互不相同,且只含小寫字母,長度不超過 50)。第 n+2 行一個(gè)整數(shù) m,表示教練報(bào)的名字。接下來 m 行,每行一個(gè)字符串表示教練報(bào)的名字(只含小寫字母,且長度不超過 50)。
輸出格式:
對(duì)于每個(gè)教練報(bào)的名字,輸出一行。如果該名字正確且是第一次出現(xiàn),輸出“OK”,如果該名字錯(cuò)誤,輸出“WRONG”,如果該名字正確但不是第一次出現(xiàn),輸出“REPEAT”。(均不加引號(hào))
輸入輸出樣例
輸入樣例#1
5
a
b
c
ad
acd
3
a
a
e
輸出樣例
OK
REPEAT
WRONG
非常非常裸的字典樹,看了我前幾篇的應(yīng)該對(duì)字典樹有了解,我也不再多說了;
直接將所有名字建成一棵字典樹,點(diǎn)名時(shí)記錄每個(gè)名字被點(diǎn)到的次數(shù),最后判斷一下就行了;
直接上代碼
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
struct Node{
int son[27],f,vis;
}N[500010];
int n,m,cnt=1;
char name[55];
void insert(char name[]){
int now=1;
for(int i=0;name[i]!='\0';i++){
if(N[now].son[name[i]-'a']) now=N[now].son[name[i]-'a'];
else{N[now].son[name[i]-'a']=++cnt; now=cnt;}
}
N[now].f=1;
}
int find(char name[]){
int now=1;
for(int i=0;name[i]!='\0';i++){
if(!N[now].son[name[i]-'a']) return -1;
else now=N[now].son[name[i]-'a'];
}
if(N[now].f){
if(N[now].vis) return 0;
else{
N[now].vis=1;
return 1;
}
}
else return -1;
}
int main(){
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 pd=find(name);
if(pd==-1) printf("WRONG\n");
else if(pd==0) printf("REPEAT\n");
else printf("OK\n");
}
return 0;
}
給個(gè)贊謝謝了?。?!