1 条题解
-
-2
典型的字符串匹配相关题目,考虑使用字典树解决,首先将所有的学生姓名都添加进字典树,然后在结束位置打上标记,查询时,若当前查询串指向的位置p=0,则说明不存在该学生姓名,直接return -1;查询串遍历完成后,首先看p位置是否存在标记,若不存在也return -1;否则根据vis数组看是否是第一次点名,并更新vis数组。
#include <bits/stdc++.h> #define ll long long using namespace std; const int N = 500005; int n, m, k, s, t, tot = 1; int trie[N][26], ed[N], vis[N], len, ans; // vis 有没有点过名 char str[N]; void insert(char *str) { int len = strlen(str), p = 1; for (int k = 0; k < len; k++) { int ch = str[k] - '0'; if (trie[p][ch] == 0) trie[p][ch] = ++tot; p = trie[p][ch]; } ed[p]++; // 结束标记 } int query(char *str) { int len = strlen(str), p = 1; for (int k = 0; k < len; ++k) { p = trie[p][str[k] - '0']; if (p == 0) return -1; // 非法 } if (ed[p]) // 存在结束标记 { return (vis[p] == 0 ? vis[p] = 1, 0 : 1);// 是否点过名 } else return -1;//不存在返回非法 } int main() { cin >> n; for (int i = 1; i <= n; ++i) { cin >> str; insert(str); } cin >> m; for (int i = 1; i <= m; ++i) { cin >> str; k = query(str); if (k == -1) puts("WRONG"); else if (k == 0) puts("OK"); else puts("REPEAT"); } }
- 1
信息
- ID
- 2044
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 42
- 已通过
- 32
- 上传者