1 条题解

  • -1
    @ 2023-12-4 19:58:57

    看数据范围,考虑 O(n2)\text{O}(n^2) 算法。基本思路如下:

    以字符串 stst 中的第 ii 个元素为基准,螺旋式寻找与 sis_i 相同的元素 sjs_j。若 i>ji>j ,则它到 ii 的距离为 ijcntlefti-j-cnt_{left};若 i<ji<j ,则它到 ii 的距离为 jicntrightj-i-cnt_{right}cntleftcnt_{left}cntrightcnt_{right} 分别表示 (j,i)(j,i)(i,j)(i,j) 里有多少个元素等于 sis_i

    搜索方式的考虑:假设 len=11len=11i=6i=6,则搜索顺序如下:9,7,5,3,1,0,2,4,6,8,109,7,5,3,1,0,2,4,6,8,10。若 i=5i=5,则搜索顺序如下:7,5,3,1,0,2,4,6,8,10,127,5,3,1,0,2,4,6,8,10,12,其中第 1111 个搜索的位置为 s1s_{-1},此时需要特判。设 tt 表示已搜索的字符数,则循环结束条件为 t=s.size()t=s.size(),注意 tt 的初值为 11。设已进行 cntcnt 次搜索,则 jj 的变化规律为:

    j+=(cnt%2)?(cnt+1):(-cnt-1)

    循环的初值、终止条件、变化规律如下:

    for(int j=i-1;t<s.size();j+=(cnt%2)?(cnt+1):(-cnt-1))

    cntcnttt 的增值规则如下:

    cnt++;

    if(j<0)continue;

    t++;

    根据以上信息,易得代码:(此处只展示循环部分)

    for(int j=i-1;t<s.size();j+=(cnt%2)?(cnt+1):(-cnt-1)){
    	cnt++;
    	if(j<0)continue;
    	t++;
    	if(s[j]!=ch)continue;
    	else if(j<i&&s[j]==ch&&tot+(i-j-(lftcnt+1))<=n)lftcnt++,tot+=i-j-lftcnt;
    	else if(j>i&&s[j]==ch&&tot+(j-i-(rgtcnt+1))<=n)rgtcnt++,tot+=j-i-rgtcnt;
    	else if(s[j]==ch)break;
    }
    

    其余请独立思考。

    • 1

    信息

    ID
    641
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    23
    已通过
    6
    上传者