hdu1867KMP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1867
题意(重要):给两个字符串,要求串1后缀+本身和串2前缀+本身能有重叠的就省略输出,或者串2后缀和串1前缀;如果两种情况得到的字符串长度相等,就输出字典序小的一个;
注意就是asdf 和sdfg,或者sdfg和asdf 都会得到asdfg;
做这道题在同学已经告诉我题意的情况下我还做错了N多次。。。才发现全局变量原来也是有局限性。。。。用在该用的地方。。。
AC代码(好不容易啊。。):
#include<iostream> #include<stdio.h> #include<cstring> #include<algorithm> using namespace std; const int maxn=100000+10; void getnext(char *b,int l2,int *next) { memset(next,0,sizeof(next)); int i=0,j=-1; next[0]=-1; while(i<l2) { if(j==-1||b[i]==b[j]) { i++,j++; next[i]=j; } else j=next[j]; } } int kmp(char *a,char *b,int l1,int l2) { int next[maxn]; getnext(b,l2,next); int i=0,j=0; while(i<l1) { if(j==-1||a[i]==b[j]) i++,j++; else j=next[j]; } return i-j; } int main() { int len1,len2; char s1[maxn],s2[maxn],s3[maxn*2],s4[maxn*2]; while(scanf("%s%s",&s1,&s2)!=EOF) { memset(s3,0,sizeof(s3)); memset(s4,0,sizeof(s4)); len1=strlen(s1); len2=strlen(s2); int k1=kmp(s1,s2,len1,len2); int k2=kmp(s2,s1,len2,len1); // printf("%d %d\n",k1,k2); for(int i=0;i<k1;i++) s3[i]=s1[i]; strcat(s3,s2); for(int i=0;i<k2;i++) s4[i]=s2[i]; strcat(s4,s1); // printf("%s\n%s\n",s3,s4); len1=strlen(s3); len2=strlen(s4); if(len1<len2)printf("%s\n",s3); else if(len2<len1)printf("%s\n",s4); else { if(strcmp(s3,s4)<0)printf("%s\n",s3); else printf("%s\n",s4); }0 } return 0; }

浙公网安备 33010602011771号