kmp轻改

我的思路是,直接在s1中kmps2
然后,当匹配到s2的最后时,直接return j就可以了

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int max_n = 5e4+100;
char s[max_n],p[max_n];
int net[max_n];
void getnext(){
    int n = strlen(p);p[n]=1;net[0]=-1;
    for (int i=0,j=-1;i<n;){
        if (j==-1||p[i]==p[j]){
            ++i;++j;
            if (p[i]!=p[j])net[i]=j;
            else net[i]=net[j];
        }else j=net[j];
    }p[n]='\0';
}
int kmp(){
    int n = strlen(s);int m = strlen(p);
    s[n]=1;p[m]=2;
    for (int i=0,j=0;i<n;){
        if (j==-1||p[j]==s[i])++i,++j;
        else j=net[j];
        if (i==n)return j;
    }s[n]='\0';p[m]='\0';
}
int main(){
    while (~scanf("%s\n%s",p,s)){
        getnext();
        int ans = kmp();
        if (ans==0)printf("0\n");
        else{
            for (int i=0;i<ans;++i)printf("%c",p[i]);
            printf(" %d\n",ans);
        }
    }
}

但是似乎还是由更巧妙的方法,
直接getnext(s1+" "+s2)然后return next[2*n+1]就可以了
真的是太妙了,感觉有点类似后缀数组哦