hdu 1867 A + B for you again
2016-03-22 15:06
549 查看
题目大意:两个字符串合并成一个,串1的后缀和串2前缀相同部分只出现一次,不固定串1串2,要求合并后串长最小,如果有等串长的两种情况出现,取字典序小的。
算法分析:改进kmp算法求得s1后缀与s2前缀的最大相同长度x,之后输出s1和s2+x
Sample Input
Sample Output
算法分析:改进kmp算法求得s1后缀与s2前缀的最大相同长度x,之后输出s1和s2+x
Sample Input
asdf sdfg asdf ghjk
Sample Output
asdfg asdfghjk
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN= 100010; char s1[MAXN],s2[MAXN]; int next[MAXN]; void get_nextval(char s[])//求next数组 { int i,j; i = -1; j = 0; next[0] = -1; int len = strlen(s); while(j<len) { if(i == -1 || s[i] == s[j]) { j++; i++; next[j] = i; } else i = next[i]; } } int KMP(char s1[],char s2[])//返回s1后缀和s2前缀的最大相同长度!!!!!,参数的顺序很重要。 { int i,j; i = 0; j = 0; get_nextval(s2); int len1 = strlen(s1),len2 = strlen(s2); while(i<len1 && j<len2) { if(j == -1 || s1[i] == s2[j]) { i++; j++; } else j = next[j]; } //kmp改进部分 if(i == len1) { return j; } return 0; } int main() { int a,b; while(scanf("%s%s",s1,s2) != EOF) { a = KMP(s1,s2); b = KMP(s2,s1);//首先取最短的字符串输出,如果相同,比较字典序即可 if(a == b) { if(strcmp(s1,s2)>0) printf("%s%s\n",s2,s1+a); else printf("%s%s\n",s1,s2+a);//s2+a意思是从s2[a]开始输出字符串 } else if(a>b) { printf("%s%s\n",s1,s2+a); } else printf("%s%s\n",s2,s1+b); } return 0; }
相关文章推荐
- AIDL进程间通信
- Delete Duplicate Emails
- Duplicate Emails
- shared_ptr的一些尴尬 http://blog.csdn.net/henan_lujun/article/details/8984543
- svnmanager:You entered an invalid email address.
- 【uva11374】Airport Express 最短路
- 查找行迁移及消除行迁移(chained rows)
- 韦玮:解决Ubuntu的root账号无法登录SSH问题-Permission denied, please try again.
- maven中指定main方法并且导入关联jar包
- Wait和Sleep的区别
- 人工智能的突破需要颠覆图灵机吗?
- 人工智能
- 2016-03-22 OneZero团队 Daily Scrum Meeting
- My Dad said
- NEU 1685: All Pair Shortest Path
- 【杭电oj】1787 - GCD Again(欧拉函数)
- 你真的了解人工智能吗?——聊聊AI的碰壁和冬天
- 220. Contains Duplicate III
- http://blog.csdn.net/lmj623565791/article/details/50709663
- 利用aircrack-ng工具获取附近wifi的密码