A + B for you again(KMP)
来源:互联网 发布:龙轩导航 源码 编辑:程序博客网 时间:2024/05/14 06:08
A + B for you again
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4940 Accepted Submission(s): 1248
Problem Description
Generally speaking, there are a lot of problems about strings processing. Now you encounter another such problem. If you get two strings, such as “asdf” and “sdfg”, the result of the addition between them is “asdfg”, for “sdf” is the tail substring of “asdf” and the head substring of the “sdfg” . However, the result comes as “asdfghjk”, when you have to add “asdf” and “ghjk” and guarantee the shortest string first, then the minimum lexicographic second, the same rules for other additions.
Input
For each case, there are two strings (the chars selected just form ‘a’ to ‘z’) for you, and each length of theirs won’t exceed 10^5 and won’t be empty.
Output
Print the ultimate string by the book.
Sample Input
asdf sdfgasdf ghjk
Sample Output
asdfgasdfghjk
Author
Wang Ye
Source
2008杭电集训队选拔赛——热身赛
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int MAXN = 100005,MAXM = 100005;char A[MAXN],B[MAXM];int Next[MAXM];void get_next(char *a,int len){ int i=-1,j=0; Next[0]=-1; while(j<len){ if(i == -1 || a[i] == a[j]){ if(a[++i] == a[++j])Next[j]=Next[i]; else Next[j]=i; }else i=Next[i]; }}int KMP(char *a,char *b,int lena,int lenb){ get_next(a,lena); int i=0,j=0; while(i<lena && j<lenb){ if(i == -1 || a[i] == b[j])++i,++j; else i=Next[i]; } if(i<lena || (i == lena && j == lenb))return i;//a不能是b中间部分的字串 return 0;}int main(){ int len1,len2,p1,p2,i; while(cin>>A>>B) { //cout<<T<<" "<<P<<endl; len1=strlen(A); len2=strlen(B); p1=KMP(A,B,len1,len2);//B中找A,找到的最大长度 p2=KMP(B,A,len2,len1);//A中找B,找到的最大长度 /* 比如:asdf sdfg 在B中根本找不到A的子串(必须从头开始) 而在A中却能找到B的子串最大长度为3 所以输出 0 3 cout<<p1<<" "<<p2<<endl;*/ if(p1==p2) { if(strcmp(A,B)<0) { cout<<A; cout<<B+p2<<endl; } else { cout<<B; cout<<A+p1<<endl; } } else { if(p1>p2)//说明在B中找到了A的子串 { cout<<B; cout<<A+p1<<endl; } else//在A中找到了B的子串 { cout<<A; cout<<B+p2<<endl; } } }}
0 0
- 【KMP】 hdu1867 A + B for you again
- hdu1867 A + B for you again KMP
- A + B for you again + KMP
- hdu1867 A + B for you again (KMP)
- HDU1867 - A + B for you again(KMP)
- HDU1867:A + B for you again(KMP)
- A + B for you again(KMP)
- hdu1867 A + B for you again(kmp)
- A + B for you again KMP
- HDU1867:A + B for you again【kmp】
- hdu -- 1867 A + B for you again (KMP)
- hdu 1867——A + B for you again(KMP)
- KMP-hdu-1867 A + B for you again
- hdu 1867 A + B for you again (KMP)
- HDU 1867 A + B for you again KMP
- hdu 1867 KMP A + B for you again
- HDU 1867 A + B for you again(简单KMP)
- HDU 1867 A + B for you again (KMP)
- 学习笔记(十)——软件包管理:rpm + yum
- NSString
- 学习笔记(十)——软件包管理:rpm + yum
- 学习笔记(十一)——Linux Shell 基础知识
- 多学一点(九)——使用touch命令创建指定时间的文件
- A + B for you again(KMP)
- 探秘Node.js(一)——Node.js简介及安装配置
- JavaScript中的面向对象(一)——创建自定义对象
- 工作积累(一)——使用canvas实现前台图片base64转码
- JavaScript中的函数声明和函数表达式
- 使用 .gitignore来忽略某些文件
- 走近Redis(一)——Redis安装及基本key操作
- 多学一点(十)——配置一个Tomcat使其可以多端口访问
- 多学一点(十一)——配置使用Tomcat Manager进行可视化部署