P2580 于是他错误的点名开始了
trie树
#include <bits/stdc++.h>
using namespace std;
int n, m, tot=1;
int trie[500010][27];
bool tail[500010];
int cnt[500010];
string s;
void insert(string str)
{
int len=str.length();
int p=1;
for(int i=0; i<len; ++i){
int ch=str[i]-'a';
if(trie[p][ch]==0){
trie[p][ch]=++tot;
}
p=trie[p][ch];
}
tail[p]=true;
}
int search(string str)
{
int len=str.length();
int p=1;
for(int i=0; i<len; ++i){
p=trie[p][str[i]-'a'];
if(p==0){
return -1;
}
}
if(tail[p]){
if(cnt[p]==0){
cnt[p]++;
return 0;
}
else{
return 1;
}
}
}
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
cin >> s;
insert(s);
}
scanf("%d", &m);
for(int i=1; i<=m; ++i){
cin >> s;
int result=search(s);
if(result!=-1){
if(result==0){
printf("OK\n");
}
else{
printf("REPEAT\n");
}
}
else{
printf("WRONG\n");
}
}
return 0;
}
|