hdu 1867——A + B for you again(KMP)

来源:互联网 发布:php cookie能存多少 编辑:程序博客网 时间:2024/05/28 16:23

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1867

解题思路:KMP算法求字符串匹配,不过要小修改一下,KMP判断s1是否为s2的子串,而本题若s2的前部分与s1的后部分匹配,则连在一起,否则按照字典顺序连接在一起

#include <stdio.h>#include <string.h>#include <stdlib.h>char s1[100005],s2[100005];//KMP算法void getNext(char *s,int *next){int j,k;next[0]=-1;j=0;k=-1;int l=strlen(s);while(j<l){if(k==-1 || s[j]==s[k]){j++;k++;next[j]=k;}elsek=next[k];}}int kmp(char *s,char *p){int next[100005];int i,j;i=0;j=0;getNext(p,next);int l1=strlen(s),l2=strlen(p);while(i<l1 && j<l2){if(j==-1 || s[i]==p[j]){i++;j++;}elsej=next[j];}if(i>=l1)return j;elsereturn 0;}int main(){int i;while(scanf("%s%s",s1,s2)!=EOF){int index1=kmp(s1,s2);int index2=kmp(s2,s1); //分别记下匹配位置的下标if(index1>index2){printf("%s",s1);for(i=index1;s2[i];i++)printf("%c",s2[i]);}else if(index2>index1){printf("%s",s2);for(i=index2;s1[i];i++)printf("%c",s1[i]);}else{if(strcmp(s1,s2)>0){printf("%s",s2);for(i=index1;s1[i];i++)printf("%c",s1[i]);}else{printf("%s",s1);for(i=index1;s2[i];i++)printf("%c",s2[i]);}}printf("\n");}return 0;}


原创粉丝点击