社区讨论

P4391时间复杂度计算

P4391[BalticOI 2009] Radio Transmission 无线传输参与者 3已保存回复 11

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
11 条
当前快照
1 份
快照标识符
@lo1b8u37
此快照首次捕获于
2023/10/22 18:12
2 年前
此快照最后确认于
2023/11/21 20:07
2 年前
查看原帖
代码如下,这样写我算起来是O(n*n)的,为什么能过呢?
CPP
#include <bits/stdc++.h>
using namespace std;

const int MOD = 1e7+7, base = 31, N = 1e7+10;
int d,p[N],hsh[N];//p[i] = base^i, hsh[i] = 前i个字符组成字符串的哈希值(记得mod)
string s;

bool check(int len){
    int tip = hsh[len], yu = d%len, i;
    for (i = len*2; i <= d - yu; i += len) //滚动哈希看是否重复
		if(tip != (hsh[i] - 1LL * hsh[i-len] * p[len] % MOD + MOD) % MOD) return false;
    if(yu != 0) //看尾部余出来的部分
		if(hsh[yu] != (hsh[d] - 1LL * hsh[d-yu] * p[yu] % MOD + MOD) % MOD) return false;
    return true;
}

int main(){
    cin>>d;
    cin>>s; 
    //初始化
    p[0] = 1;
    for (int i = 1; i <= d; i++)
    {
        p[i] = 1ll * p[i-1] * base % MOD;
        hsh[i] = (1ll * hsh[i-1] * base % MOD + s[i-1] - 'a' + 1) % MOD; 
    }
    for (int i = 1; i <= d; i++)//枚举重复的字符串长度
        if(check(i)){
            cout<<i<<endl;
            return 0;
        }
    return 0;
}

回复

11 条回复,欢迎继续交流。

正在加载回复...