[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher J HDU 2594

来源:互联网 发布:centos关机命令 编辑:程序博客网 时间:2024/05/16 12:14

题目地址:https://vjudge.net/contest/70325#problem/J

思路:我将两个串连一起,然后求一下Next就好啦~哦大概还要判断一下会不会越界。next数组记得要开2倍= =

AC代码:

#include<bits/stdc++.h>using namespace std;const int maxn=50000+10;char a[maxn],b[maxn];char t[maxn*2];int tlen,Next[maxn*2];void getNext(){    int j,k;    j=0,k=-1,Next[0]=-1;    while(j<tlen)    {    if(k==-1 || t[j]==t[k])        Next[++j]=++k;    else        k=Next[k];    }}int main(){    while(gets(a))    {        gets(b);        int l1,l2;        l1=strlen(a);        l2=strlen(b);        int k=0;        memset(t,0,sizeof(t));        for(int i=0;i<l1;i++)            t[k++]=a[i];        for(int i=0;i<l2;i++)            t[k++]=b[i];        tlen=strlen(t);        getNext();        if(Next[tlen]>=l1 || Next[tlen]>=l2)            Next[tlen]=min(l1,l2);        for(int i=0;i<Next[tlen];i++)        {              printf("%c",t[i]);              if(i==Next[tlen]-1)                printf(" ");        }        printf("%d\n",Next[tlen]);    }}


0 0