HDU 2594

来源:互联网 发布:oracle数据库跟踪工具 编辑:程序博客网 时间:2024/05/29 18:22

题目的意思是有两个字符串a,b。  a的最大前缀和b的最大后缀相同几个。  刚开始看题目以为只要先把两个字符串连接一下,然后next数组修改一下就可以后来发现并不对,因为有可能前缀会包含到另一个字符串中。所以只要把第二个字符串当作原串,第一个当作模式串,通过kmp找相同的就可以了。

(不要嘲笑我代码写的难看)!!!!

#include <algorithm>#include <iostream>#include <iomanip>#include <cstring>#include <cstdlib>#include <cstdio>#include <string>#include <vector>#include <queue>#include <cmath>#include <stack>#include <map>#include <cmath>#include <set>#include <climits>#define INF 0x7fffffff#define finc(i,a,b) for(i=a;i<=b;i++)#define fdec(i,a,b) for(i=a;i>=b;i--)using namespace std;char s[60000],p[60000];int next[60000];void getnext(char *p,int *next){int i=0,j=-1;next[0]=-1;    int c=strlen(p);    while(i<c)    {    if(j==-1||p[i]==p[j])    {    i++;    j++;    next[i]=j;    }    else     j=next[j];    }}int kmp(char *s,char *p){int i=0,j=0;getnext(p,next);int c=strlen(s);int m=strlen(p);while(i<c){if(j==-1||s[i]==p[j]){i++;j++;}elsej=next[j];}if(i==c&&j>0){  return j;}elsereturn -1;}int main(){int i,j;while(~scanf("%s",s)){scanf("%s",p);int n=kmp(p,s);if(n==-1)printf("0\n");else{for(i=0;i<n;i++){if(i==n-1)printf("%c ",s[i]);elseprintf("%c",s[i]);}printf("%d\n",n);}}return 0;}


0 0