题目背景
XS中学化学竞赛组教练是一个酷爱炉石的人。
他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛 CON900)。
题目描述
这之后校长任命你为特派探员,每天记录他的点名。校长会提供化学竞赛学生的人数和名单,而你需要告诉校长他有没有点错名。(为什么不直接不让他玩炉石。)
输入格式
第一行一个整数 nn,表示班上人数。
接下来 nn 行,每行一个字符串表示其名字(互不相同,且只含小写字母,长度不超过 5050)。
第 n+2n+2 行一个整数 mm,表示教练报的名字个数。
接下来 mm 行,每行一个字符串表示教练报的名字(只含小写字母,且长度不超过 5050)。
输出格式
对于每个教练报的名字,输出一行。
如果该名字正确且是第一次出现,输出
OK
,如果该名字错误,输出WRONG
,如果该名字正确但不是第一次出现,输出REPEAT
。输入输出样例
输入 #1复制
5 a b c ad acd 3 a a e输出 #1复制
OK REPEAT WRONG说明/提示
- 对于 40\%40% 的数据,n\le 1000n≤1000,m\le 2000m≤2000。
- 对于 70\%70% 的数据,n\le 10^4n≤104,m\le 2\times 10^4m≤2×104。
- 对于 100\%100% 的数据,n\le 10^4n≤104,m≤10^5m≤105。
\text{upd 2022.7.30}upd 2022.7.30:新增加一组 Hack 数据。
1.这是一道有关字典树的题目。
2.我们平时查字典就是这个案列,我们查英文字典时,会按照首字母,其次再是第二个字母去查,因此这个题目我们需要构建一棵树。
3.我们首先需要一个根节点(这是为了更好的使用)它。我们的每个节点基本都是这个:
4.然后next数组之所以开27是因为我们需要连接接下来的字母,是对于小写字母来的。
然后我们需要初始化
在结构体里面有一个isend值,该值是判断是否能构成一个单词。我们很可能遇到这种情况
名字分别是abc,但是他报的是a,答案是为wrong。
所以我们使用的时候 让 isend=1。
如果遇到新的我们就需要创建:
否则就是往下走:
C代码如下:
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
char ch;
int isend;
struct node *next[27];
}NODE;
NODE tree;
NODE csh(NODE *p)
{
int i;
for(i=0;i<27;i++)
{
p->next[i]=NULL;
}
}
int n,m;
int fun(char name[])
{
int i,k;
NODE *p=&tree,*q;
for(i=0;name[i];i++)
{
k=name[i]-'a';
if((p->next[k])==NULL)
{
q=(NODE *)malloc(sizeof(NODE));
csh(q);
p->next[k]=q;
q->ch=name[i];
p=q;
}
else
{
p=p->next[k];
}
}
p->isend=1;
}
int slove(char name[])
{
int i,k;
NODE *p=&tree;
for(i=0;name[i];i++)
{
k=name[i]-'a';
if(p==NULL||p->next[k]==NULL)
{
printf("WRONG\n");
return 0;
}
if(name[i]==(p->next[k])->ch)
{
p=p->next[k];
}
else
{
printf("WRONG\n");
return 0;
}
}
if(p->isend==1)
{
printf("OK\n");
p->isend++;
return 0;
}
else if(p->isend)
{
printf("REPEAT\n");
p->isend++;
return 0;
}
printf("WRONG\n");
return 0;
}
int main()
{
int i;
char name[55];
csh(&tree);
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",name);
fun(name);
}
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%s",name);
slove(name);
}
return 0;
}
C++代码:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
struct node
{
char ch;
int isend;
struct node *next[27];
};
node tree;
node csh(node *p)
{
int i;
for(i=0;i<27;i++)
{
p->next[i]=NULL;
}
}
int n,m;
int fun(char name[])
{
int i,k;
node *p=&tree,*q;
for(i=0;name[i];i++)
{
k=name[i]-'a';
if((p->next[k])==NULL)
{
q=(node *)malloc(sizeof(node));
csh(q);
p->next[k]=q;
q->ch=name[i];
p=q;
}
else
{
p=p->next[k];
}
}
p->isend=1;
}
int slove(char name[])
{
int i,k;
node *p=&tree;
for(i=0;name[i];i++)
{
k=name[i]-'a';
if(p==NULL||p->next[k]==NULL)
{
cout << "WRONG\n" ;
return 0;
}
if(name[i]==(p->next[k])->ch)
{
p=p->next[k];
}
else
{
cout << "WRONG\n" ;
return 0;
}
}
if(p->isend==1)
{
cout << "OK\n" ;
p->isend++;
return 0;
}
else if(p->isend)
{
cout << "REPEAT\n" ;
p->isend++;
return 0;
}
cout << "WRONG\n" ;
return 0;
}
int main()
{
int i;
char name[55];
csh(&tree);
cin >> n;
for(i=0;i<n;i++)
{
cin >> name;
fun(name);
}
scanf("%d",&m);
for(i=0;i<m;i++)
{
cin >> name;
slove(name);
}
return 0;
}