已经A的小伙伴可以用这组数据检查一下自己的程序,这题的数据有点弱
查看原帖
已经A的小伙伴可以用这组数据检查一下自己的程序,这题的数据有点弱
64236
WA_orz楼主2023/3/21 10:54

这里是一个AC错误的代码

开始的逻辑是做匹配如果匹配到了S2串的最后一个位置也成功,那么S2串匹配结束,这时候让S2串最后一个位置失配去移动S2串,但是这样的话当出现下面这种数据的时候程序就会死循环,这题的数据并没有这样的数据所以下面这段代码可以A,但是实际上是错的。 S1:AAAAAAAA S2:A

#include<bits/stdc++.h>
using namespace std;
#define MAX 1000005

int nxt[MAX],nxtrv[MAX],idx;
string a,b;

int main(){
    cin>>a>>b;
    for(int i = 1;i < b.size();i++){
        idx = nxt[i-1];
        while(idx!=0&&b[i]!=b[idx])idx = nxt[idx-1];
        nxt[i]=b[i]==b[idx]?idx+1:0;
    }
    nxtrv[0] = -1;
    for(int i = 1;i < b.size();i++){
        nxtrv[i] = nxt[i-1];
    }

    idx = 0;
    for(int i = 0;i < a.size();i++){
        while(idx&&a[i]!=b[idx]) idx = nxtrv[idx];
        if(a[i]==b[idx]) idx++;
        if(idx == b.size()) {
            printf("%d\n",i+2-int(b.size()));
            idx = nxtrv[idx-1];
            i--;
        }
    }
    
    for(int i = 0;i < b.size();i++){
        printf("%d ",nxt[i]);
    }printf("\n");
    return 0;
}
2023/3/21 10:54
加载中...