HDU - 2594 Simpsons’ Hidden Talents
题意:
求第一个字符串的前缀与第二个字符串的后缀最长相同的长度。输出这个前缀 和 他的长度
思路:
1、在两个字符串相连接处添加一个特殊符号(字符串中不会出现的符号)就行
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=50010;
int nxt[2*maxn];
char a[maxn],b[maxn],c[2*maxn];
int len;
void getnxt()
{
int i,j;
i = 0;
j = nxt[i] = -1;
while(i<len)
{
if(j==-1 || c[i]==c[j])
{
i++,j++;
if(c[i]!=c[j])
nxt[i] = j;
else
nxt[i] = nxt[j];
}
else
j = nxt[j];
}
}
int main()
{
while(~scanf("%s",a))
{
scanf("%s",b);
int alen = strlen(a);
int blen = strlen(b);
int m = min(alen,blen);
memset(c,0,sizeof(c));
memset(nxt,0,sizeof(nxt));
strcpy(c,a);
strcat(c,"#");
strcat(c,b);
len = strlen(c);
getnxt();
int n = nxt[len];
if(n<1)
printf("0\n");
else
{
for(int i=0;i<n;i++)
printf("%c",c[i]);
printf(" %d\n",n);
}
}
return 0;
}
2、一开始想的不够完全,少了一种情况。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=50010;
int nxt[2*maxn];
char a[maxn],b[maxn],c[2*maxn];
int len;
void getnxt()
{
int i,j;
i = 0;
j = nxt[i] = -1;
while(i<len)
{
if(j==-1 || c[i]==c[j])
{
i++,j++;
if(c[i]!=c[j])
nxt[i] = j;
else
nxt[i] = nxt[j];
}
else
j = nxt[j];
}
}
int main()
{
while(~scanf("%s",a))
{
scanf("%s",b);
int alen = strlen(a);
int blen = strlen(b);
memset(c,0,sizeof(c));
memset(nxt,0,sizeof(nxt));
strcpy(c,a);
strcat(c,b);
len = strlen(c);
getnxt();
int n = nxt[len];
if(n)
{
if(n>min(alen,blen)) //输出不到n个字符
{
if(alen<blen)
printf("%s %d\n",a,alen);
else
printf("%s %d\n",b,blen);
}
else //输出n个字符
{
for(int i=0;i<n;i++)
printf("%c",c[i]);
printf(" %d\n",n);
}
}
else //无相同前后缀
printf("0\n");
}
return 0;
}