Simpsons’ Hidden Talents
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3323 Accepted Submission(s): 1247
Marge: Yeah, what is it?
Homer: Take me for example. I want to find out if I have a talent in politics, OK?
Marge: OK.
Homer: So I take some politician’s name, say Clinton, and try to find the length of the longest prefix
in Clinton’s name that is a suffix in my name. That’s how close I am to being a politician like Clinton
Marge: Why on earth choose the longest prefix that is a suffix???
Homer: Well, our talents are deeply hidden within ourselves, Marge.
Marge: So how close are you?
Homer: 0!
Marge: I’m not surprised.
Homer: But you know, you must have some real math talent hidden deep in you.
Marge: How come?
Homer: Riemann and Marjorie gives 3!!!
Marge: Who the heck is Riemann?
Homer: Never mind.
Write a program that, when given strings s1 and s2, finds the longest prefix of s1 that is a suffix of s2.
The lengths of s1 and s2 will be at most 50000.
clinton homer riemann marjorie
0 rie 3
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>
#include <stack>
#define maxn 10000+5
#define ull unsigned long long
#define ll long long
#define reP(i,n) for(i=1;i<=n;i++)
#define rep(i,n) for(i=0;i<n;i++)
#define cle(a) memset(a,0,sizeof(a))
#define mod 90001
#define PI 3.141592657
#define INF 1<<30
const ull inf = 1LL << 61;
const double eps=1e-5;
using namespace std;
bool cmp(int a,int b){
return a>b;
}
int f[100005];
char p[100005],t[50005];
void getFail(char* p, int* f)
{
int m = strlen(p);
f[0] = 0;
f[1] = 0;
for (int i = 1; i < m; i++)
{
int j = f[i];
while (j && p[i] != p[j])
{
j = f[j];
}
f[i + 1] = p[i] == p[j] ? j + 1 : 0;
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(~scanf("%s%s",p,t))
{
int len1=strlen(p);
int len2=strlen(t);
int len=len1+len2;
strcat(p,t);///字符串拼接
getFail(p,f);
int k=0;
while(f[len]>len1||f[len]>len2)
{
len=f[len];
}
len=f[len];
if(len==0)printf("%d\n",0);
else
{
for(int i=0;i<len;i++)
printf("%c",p[i]);
printf(" %d\n",len);
}
}
return 0;
}
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>
#define maxn 1000010
#define ull unsigned long long
#define ll long long
#define reP(i,n) for(i=1;i<=n;i++)
#define rep(i,n) for(i=0;i<n;i++)
#define cle(a) memset(a,0,sizeof(a))
#define mod 90001
#define PI 3.141592657
#define INF 1<<30
const ull inf = 1LL << 61;
const double eps=1e-5;
using namespace std;
bool cmp(int a,int b){
return a>b;
}
char p[50005],t[50005];
int f[50005];
void getFail(char *p,int *f,int m)
{
f[0]=0;
f[1]=0;
for(int i=1;i<m;i++)
{
int j=f[i];
while(j&&p[i]!=p[j])
{
j=f[j];
}
f[i+1]=p[i]==p[j]?j+1:0;
}
}
int find(char *t,char *p,int *f)
{
int n=strlen(t),m=strlen(p);
getFail(p,f,m);
int j=0;
for(int i=0;i<n;i++)
{
while(j&&p[j]!=t[i])
{
j=f[j];
}
if(p[j]==t[i])j++;
}
return j;
}
int main()
{
while(~scanf("%s%s",p,t))
{
cle(f);
int k=find(t,p,f);
if(k==0)
printf("%d\n",0);
else
{
for(int i=0;i<k;i++)
printf("%c",p[i]);
printf(" %d\n",k);
}
cle(p),cle(t);
}
return 0;
}