代码和题解类似,但是为什么超时了?

P3612 [USACO17JAN] Secret Cow Code S

冰封侠 @ 2022-02-16 22:41:24

我按照题解的思路自己打的代码,和题解差不多,但不明白为什么我的代码会超时,求dalao解答

以下是源代码

#include<iostream>
#include<string>
using namespace std;
long long n, len, i;
string s;
int main() {
    cin >> s >> n;
    len = s.length();
    while(n > s.length()) {
        while (len < n) len *= 2;
        len = len / 2;
        n -= 1 + len;
        if (n == 0) n = len;

    }
    cout << s[n - 1] << endl;
    return 0;
}

by Amore_eterno @ 2022-02-16 22:42:55

@冰封侠 s.length()每次都得算一遍,每次都是O(n)的


by Loser_King @ 2022-02-16 23:12:06

@Konnyaku41377 s.length() 是 O(1) 的,C 里的 strlen(s) 是 O(n) 的。


by pocafup @ 2022-02-17 04:49:33

跟第一篇题解大同小异,但你没用 i 啊

具体逻辑没认真看,但题解的 len 是不变的,而你这个是变的


by 冰封侠 @ 2022-02-17 20:04:56

@pocafup 在题解的 "while(num<n)" 中我觉得num可以用s.length()替代,所以就换掉了。然后用len来代替num的作用,就没有定义i。


by 冰封侠 @ 2022-02-17 20:06:52

@Konnyaku41377 好像不是这个的问题,我把题解的代码复制下来,把

while(num<n)

换成

while(n > s.length())

也不会超时


by pocafup @ 2022-02-18 00:32:32

@冰封侠 每次初始化len即可


|