题目传送门
题意:给你n个字符串,m次查询,每次查询一个字符串,如果原来有这个字符串且是第一次查询该串,输出OK,如果原来有这个字符串但是不是第一次查询,输出REPEAT,如果原来没有,则输出WRONG。
思路:map好像可以轻松过 。这里我用的是刚学的 trie树。把字符串存好之后每次查询即可,查询过之后num改为2,表示这个单词查询过。
trie树链表写法
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int inf=0x7fffffff;
const int mod=1e9+7;
const int eps=1e-6;
typedef long long ll;
typedef unsigned long long ull;
#define ls p<<1
#define rs p<<1|1
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl '\n'
#define null NULL
struct node
{
node *child[26];
int num;
};
void build(node *&root)
{
root=new node;
for(int i=0;i<=25;i++)
{
root->child[i]=null;
}
root->num=0;
}
void inserts(node *&root,string s)
{
node *p=root;
int cnt=0;
while(cnt<s.size())
{
if(p->child[s[cnt]-'a']==null)
{
node *temp;build(temp);
p->child[s[cnt]-'a']=temp;
}
p=p->child[s[cnt]-'a'];
cnt++;
}
p->num=1;
return ;
}
void finds(node *&root,string s)
{
node *p=root;int cnt=0;
while(cnt<s.size())
{
if(p->child[s[cnt]-'a']==null)
{
cout<<"WRONG"<<endl;
return ;
}
p=p->child[s[cnt]-'a'];
cnt++;
}
if(p->num==1)
{
cout<<"OK"<<endl;
p->num=2;
return ;
}
else if(p->num==0)
{
cout<<"WRONG"<<endl;
return ;
}
else if(p->num==2)
{
cout<<"REPEAT"<<endl;
return ;
}
}
signed main()
{
IOS;
int n;
cin>>n;
node *root;
build(root);
for(int i=1;i<=n;i++)
{
string s;
cin>>s;
inserts(root,s);
}
int m;
cin>>m;
while(m--)
{
string s;
cin>>s;
finds(root,s);
}
}