string 在 CF 的灵异事件

灌水区

Shunpower @ 2021-11-27 14:07:23

这是一份使用了 string 的代码。

string s;
void solve(){
    long long nump,nums;
    nump=nums=0;
    cin>>x>>s;
    nums=s.length();
    for(int i=0;i<x;i++){
        nump=(nums-(i+1)+Mod)%Mod;
        int f=s[i]-'1';
        if(s.length()<x){
            string p=s.substr(i+1,nump);
            for(int j=1;j<=f;j++){
                if(s.length()+nump>x){
                    s+=p.substr(0,x-s.length());
                    break;
                }
                else{
                    s+=p;   
                }
            }
        }
        nums+=1ll*nump*f%Mod;
        nums%=Mod;
    }
    cout<<nums<<endl;
}

这是另一份使用了 string 的代码。

string s,p;
void solve(){
    long long nump,nums;
    nump=nums=0;
    cin>>x>>s;
    nums=s.length();
    for(int i=0;i<x;i++){
        nump=(nums-(i+1)+Mod)%Mod;
        int f=s[i]-'1';
        if(s.length()<x){
            p=s.substr(i+1,nump);
            for(int j=1;j<=f;j++){
                if(s.length()+nump>x){
                    s+=p.substr(0,x-s.length());
                    break;
                }
                else{
                    s+=p;   
                }
            }
        }
        nums+=1ll*nump*f%Mod;
        nums%=Mod;
    }
    cout<<nums<<endl;
}

然而,第一份代码交到 CF 的结果是AC,第二份代码交到 CF 的结果是TLE。而差别仅仅是string p的位置。

这是为什么?


by Ew_Cors @ 2021-11-27 14:10:43

@LEMON_ni string建立的时间有点长加上这句话调用频率过高导致的吗?

不太清楚。比较迷幻。


by caibitter @ 2021-11-27 14:11:19

可能是放在外面的话每次覆盖都需要先把 p 清空罢(


|