题目:
荷马:玛吉,我刚想办法发现一些我们不知道的人才。
玛吉:是的,它是什么?
荷马:以我为例。我想知道我是否有政治才能,好吗?
玛吉:好的。
荷马:所以我采取一些政治家的名字,克林顿说,并试图找到最长前缀的长度
以克林顿的名字命名,这是我名字中的后缀。这就是我与克林顿这样的政治家有多接近
Marge:为什么选择最长的前缀是后缀???
荷马:嗯,我们的天赋深藏在我们自己里面,Marge。
玛吉:那你有多近?
荷马:0!
玛奇:我并不感到惊讶。
荷马:但是你知道,你必须拥有隐藏在你身边的一些真正的数学天赋。
玛奇:怎么样?
荷马:黎曼和马乔里3分!
Marge:Riemann到底是谁?
荷马:没关系。
编写一个程序,当给定字符串s1和s2时,找到s1的最后一个前缀,即s2的后缀。
input
输入包含两行。第一行包含s1,第二行包含s2。您可以假设所有字母都是小写的。
output
输出由一行组成,其中包含最长字符串,该字符串是s1的前缀和后缀s2,后跟该前缀的长度。如果最长的字符串是空字符串,则输出应为0。
s1和s2的长度最多为50000。
Sample Input
clinton homer riemann marjorie
Sample Output
0 rie 3
解题思路:
这个题让我们求出最长的字符串,该长字符串是s1最后一个前缀,s2最后一个后缀,所以把s1,s2两个字符串连接成一个字符串,然后求出next[]数组,既字符串的长度就是next[ (s1和s2和起来的字符串长度)],注意:可能会出现类似 aaa,aaaaaa 这样的两个字符串,所以我们在输出时要先判断最大长度是否与本身输入字符串大,如果超过了本身字符串长度,就输出两个字符串中较短的那个。
程序代码:
#include<stdio.h> #include<string.h> char s[100000],s1[55000],s2[55000]; int n,m,k,next[100000],t,t1; void get(); int main() { int i,j,l; while(scanf("%s%s",s1,s2)!=EOF) { i=0;j=0; n=strlen(s1); m=strlen(s2); memset(next,0,sizeof(next)); memset(s,0,sizeof(s));//注意字符串要清零h for(i=0;i<n;i++) s[i]=s1[i]; for(j=0;j<m;j++) s[i++]=s2[j]; k=strlen(s); get(); } return 0; } void get() { int i=1,j=0; int max; next[0]=-1; while(i<k) { if(j==-1||s[i]==s[j]) { i++; j++; next[i]=j; } else j=next[j]; } max=next[k]; if(max>n) max=n; if(max>m) max=m; if(max==0) printf("%d\n",max); else { for(i=k-max;i<k;i++) printf("%c",s[i]); printf(" %d\n",max); } }