这里是一个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;
}