/*
hdu2594
给你两个字符串a与b,求a的前缀与b的前缀相同的最长长度。
可以马上联想到MP算法中的f数组,其中f[i]正是s[0...i]中前缀与后缀相同的最长长度
把两个字符串连在一起,
中间加了一个特殊符号#,这样保证前缀与后缀不会跨越两个字符串
多组数据,需要每次将f清零,不然WA
Authur:lcy
Time:2017-9-28
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
using namespace std;
#define ll long long 
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define frr(i,a,b) for(int i=a;i>=b;i--)
#define ms(a,b) memset(a,b,sizeof(a))
#define scfd(a) scanf("%d",a)
#define scflf(a) scanf("%lf",a)
#define scfs(a) scanf("%s",a)
#define ptfd(a) printf("%d\n",a)
#define ptfs(a) printf("%s\n",a)
#define showd(a,b) printf(a"=%d\n",b)
#define showlf(a,b) printf(a"=%lf\n",b)
#define shows(a,b) printf(a"=%s\n",b)
#define mmcp(a,b) memcpy(a,b,sizeof(b))
#define pb(a) push_back(a)
using namespace std;
const int MAXN=50005<<1;
char s[MAXN];
int f[MAXN];
void get_fail(){
    int l=strlen(s);
    f[0]=0;
    fr(i,1,l-1){
        int j=f[i-1];
        while(j&&s[j]!=s[i])j=f[j-1];
        if(s[j]==s[i])
            f[i]=j+1;
    }
}
int main(){
    while(fgets(s,MAXN,stdin)){
        ms(f,0);
        int l=strlen(s);s[l-1]='#';
        fgets(s+l,MAXN,stdin);
        l=strlen(s);s[l-1]=0;l--;
        //printf("s=%s,l=%d\n",s,strlen(s));
        get_fail();
        if(f[l-1]){
            fr(i,0,f[l-1]-1)
                printf("%c",s[i]);
            printf(" %d\n",f[l-1]);
        }
        else 
            printf("0\n");
    }

}
 posted on 2017-09-28 15:04  cylcy  阅读(124)  评论(0)    收藏  举报