QAQ
字典树第一题,可以说是板子题了。
在结构体中再加入一个表示有没有叫过的变量就行了2333
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define idx(x) x - 'a';
struct Trie{
int net[26];//26个孩子
int val;//以这个节点为结束的单词的个数
int f;//有没有叫这个人
}tree[999999];
int nxt,n;
char ss[200];
int add()
{
memset(&tree[nxt],0,sizeof(Trie));
return nxt++;
}
void cr(char *s)
{
int rt=0,len=strlen(s);
for(int i=0;i<len;i++)
{
int c=idx(s[i]);
if(!tree[rt].net[c])
{
tree[rt].net[c]=add();
}
rt=tree[rt].net[c];
}
tree[rt].val++;
}
int find(char *s)
{
int rt=0,len=strlen(s);
for(int i=0;i<len;i++)
{
int c=idx(s[i]);
if(!tree[rt].net[c])
return 0;
rt=tree[rt].net[c];
}
if(!tree[rt].val) return 0;//没有返回0
else if(tree[rt].f)
{
return 2;//重复返回2
}
tree[rt].f=1;
return 1;//第一次叫有这个人返回1
}
int main()
{
memset(&tree[0],0,sizeof(Trie));
nxt=1;
scanf("%d",&n);
while(n--)
{
scanf("%s",ss);
cr(ss);
}
scanf("%d",&n);
while(n--)
{
scanf("%s",ss);
int a=find(ss);
if(a==0) printf("WRONG");
if(a==1) printf("OK");
if(a==2) printf("REPEAT");
puts("");
}
return 0;
}