社区讨论

为什么空间要开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 条回复,欢迎继续交流。

正在加载回复...