1 条题解

  • 0
    @ 2026-5-2 20:25:14

    题目解法

    首先枚举匹配的前缀长度,接下来枚举替换后那一段的数字和的长度。由于替换后的数字最大为 106×910^6\times 966 位,所以只需枚举到 66 即可。

    有了这两个长度,我们就可以算出匹配的后缀长度,进而算出起始位置和终止位置。接下来检查替换段是否符合条件、后缀是否相同即可。

    ::::warning[注意] 可以通过检查长度进行优化,不然会 TLE 一个点 ::::

    ::::success[AC 代码]

    #include<bits/stdc++.h>
    using namespace std;
    int s[100500];
    int main(){
        ios::sync_with_stdio(false);
        cin.tie(0);
        string a,b;
        cin>>a>>b;
        if(a==b) return puts("1 1"),0;
        s[0]=a[0]-'0';
        for(int i=1;i<a.size();i++) s[i]=s[i-1]+a[i]-'0';
        int maxn=0;
        for(int i=a.size()-1,j=b.size()-1;i>=0&&j>=0&&a[i]==b[j];i--,j--){
            maxn++;
        }
        for(int i=0;i<a.size();i++){
            if(i!=0&&a[i-1]!=b[i-1]) break;
            for(int j=1;j<=6;j++){
                int k=b.size()-j-i;
                if(a.size()-k-1<i) continue;
                if(k<0) break;
                if(k>maxn) continue;
                if(a.substr(a.size()-k,k)!=b.substr(b.size()-k,k)) continue;
                string q=to_string(s[a.size()-k-1]-((i==0)?0:s[i-1]));
                if(q.size()!=j||q!=b.substr(i,j)) continue;
                cout<<i+1<<" "<<a.size()-k<<"\n";
                return 0;
            }
        }
        return 0;
    }
    

    ::::

    • 1

    信息

    ID
    10351
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者