社区讨论
为什么空间要开1e6,不是1e5个字符串?
P2580于是他错误的点名开始了参与者 4已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo2pqqms
- 此快照首次捕获于
- 2023/10/23 17:46 2 年前
- 此快照最后确认于
- 2023/10/23 17:46 2 年前
CPP
#include <bits/stdc++.h>
using namespace std;
const int N = 100100;
int son[N][26], cnt[N], idx;
//son[u][i]表示结点为u以字母i结尾的字符是第几个 cnt[i]表示以第i个字母结尾的数有多少个
char str[N];
void insert(string str)
{
int p = 0;//每次从0开始找
for (int i = 0; str[i]; i ++ )//遍历字符串
{
int u = str[i] - 'a';//一般就是改模板就是改这里
if (!son[p][u]) son[p][u] = ++ idx;//没有就新建
p = son[p][u];//走过去
}
// cout<<p<<endl;
cnt[p] ++ ;//这个字符串的长度++
}
int query(string str)
{
int p = 0;
for (int i = 0; str[i]; i ++ )
{
int u = str[i] - 'a';
if (!son[p][u]) return 0;
p = son[p][u];
}
// cout<<p<<endl;
cnt[p]++;
// cout<<cnt[p]<<" ";
if(cnt[p]>2){
return 2;
}else if(cnt[p]==2){
return 1;
}
return 0;
}
int main()
{
int n;
scanf("%d", &n);
while (n -- )
{
string s;cin>>s;
insert(s);
}
cin>>n;
while(n--){
string s;cin>>s;
int t=query(s);
if(t==2){
cout<<"REPEAT"<<endl;
}else if(t==1){
cout<<"OK"<<endl;
}else{
cout<<"WRONG"<<endl;
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...