【题目描述】
XS中学化学竞赛组教练是一个酷爱炉石的人。
他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900)。
这之后校长任命你为特派探员,每天记录他的点名。校长会提供化学竞赛学生的人数和名单,而你需要告诉校长他有没有点错名。(为什么不直接不让他玩炉石。)
【输入格式】
第一行一个整数 n,表示班上人数。接下来 n 行,每行一个字符串表示其名字(互不相同,且只含小写字母,长度不超过 50)。第 n+2 行一个整数 m,表示教练报的名字。接下来 m 行,每行一个字符串表示教练报的名字(只含小写字母,且长度不超过 50)。
【输出格式】
对于每个教练报的名字,输出一行。如果该名字正确且是第一次出现,输出“OK”,如果该名字错误,输出“WRONG”,如果该名字正确但不是第一次出现,输出“REPEAT”。(均不加引号)
Sample InputSample~~InputSample Input
5
a
b
c
ad
acd
3
a
a
e
Sample OutputSample~~OutputSample Output
OK
REPEAT
WRONG
【题意分析】
存储一些字符串,对于询问,判断是否存在或出现了几次。
把读入信息放到trie里面,询问的时候用一个数组val[]
保存走到这里的有几个字符串。
显然根据val[]
的情况很容易能给出答案。
Code:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#define MAXN 600000
#define rep(x,y,z) for (register int x = y; x <= z; x++)
using namespace std;
int n, q;
char s[200];
//结构体封装
struct trie {
int val[MAXN], son[MAXN][26], size;
void clear () {
size = 1;
memset (val, 0, sizeof (val));
memset (son[0], 0, sizeof (son[0]));
}
inline int id (char ch) {return ch - 'a';};
inline void insert (char *s) {
int pos = 0, len = strlen (s + 1);
rep (i, 1, len) {
int v = id (s[i]);
if (! son[pos][v]) {
memset (son[size], 0, sizeof (son[size]));
son[pos][v] = size++;
}//new node
pos = son[pos][v];
}
}
inline int search (char *s) {
int pos = 0, len = strlen (s + 1);
rep (i, 1, len) {
int v = id (s[i]);
if (! son[pos][v]) return 1;
pos = son[pos][v];
}
if (! val[pos]) {
++val[pos]; return 0;
}
else return 2;
}
}tree;
int main () {
scanf ("%d", &n);
tree.clear ();
rep (i, 1, n) {
scanf ("%s", s + 1);
tree.insert (s);
}
scanf ("%d", &q);
rep (i, 1, q) {
scanf ("%s", s + 1);
int opt = tree.search (s);
if (opt == 0) puts ("OK");
if (opt == 1) puts ("WRONG");
if (opt == 2) puts ("REPEAT");
}
return 0;
}
还可以直接用map,直接把字符串当下标,30行
Code:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <map>
#include <algorithm>
#define rep(x,y,z) for (register int x = y; x <= z; x++)
using namespace std;
string s;
int n, q;
map <string, int> ans;
int main () {
ios :: sync_with_stdio (0); cin.tie (0);
cin >> n;
rep (i, 1, n) {
cin >> s;
ans[s] = 1;
}
cin >> q;
rep (i, 1, q) {
cin >> s;
if (ans[s] == 1) puts ("OK"), ans[s]++;
else if (ans[s] > 1) puts ("REPEAT");
else if (! ans[s]) puts ("WRONG");
}
return 0;
}