题意
给出N个字符串,再给出M个字符串,匹配M个字符串中的每一个字符串有没有在之前的N个字符串里出现过,如果有输出OK,如果和这M个字符串里有重复的就输出REPEAT,如果没有输出NO。
思路
用字典树来做。多开两个变量记录匹配的次数和一个节点是不是字符串的末尾。
代码
#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
int n,m,tot=1;
char s[51];
struct zi{
int son[26];
bool cnt,end;//cnt记录有没有匹配过,end记录这个节点是不是一个字符串的末尾
}trie[500001];
void read(int &tot)
{
tot=0;
char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) tot=tot*10+c-48,c=getchar();
}
void insert()
{
scanf("%s",s+1);
int x=1,l=strlen(s+1);
for (int i=1;i<=l;i++)
{
if (!trie[x].son[s[i]-97]) trie[x].son[s[i]-97]=tot++;
x=trie[x].son[s[i]-97];
}
trie[x].end=1;
}
void find()
{
scanf("%s",s+1);
int x=1,l=strlen(s+1);
for (int i=1;i<=l;i++)
{
x=trie[x].son[s[i]-97];
if (!x) {printf("WRONG\n");return;}
}
if (!trie[x].end) {printf("WRONG\n");return;}//如果这个点不是字符串的末尾说明没有这个词
if (!trie[x].cnt) {trie[x].cnt++;printf("OK\n");return;}//如果没有匹配过就输出OK并更新cnt
printf("REPEAT\n");
}
int main()
{
read(n);
for (int i=1;i<=n;i++)
insert();
read(m);
while (m--)
find();
}