Simpsons’ Hidden Talents HDU - 2594

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]就可以了
真的是太妙了,感觉有点类似后缀数组哦

Kuangbin题单详解(kmpManacher) 文章被收录于专栏

刷Kuangbin题

全部评论

相关推荐

11-14 16:13
已编辑
重庆科技大学 测试工程师
Amazarashi66:不进帖子我都知道🐮❤️网什么含金量
点赞 评论 收藏
分享
爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务