HDU 1867 A + B for you again KMP解决问题的方法
这是一个典型问题KMP申请书。
结果求增加两个字符串。该法的总和是相同的前缀和后缀也是字符串的字符串,您将可以合并本节。
但是,这个问题是不是问题非常明确的含义,因为不是太清楚,外观这两个字符串的顺序无关紧要,后只需要输出的最短的组合长度的结果,并后长度一样,那么就依照字典顺序,输出字典顺序在前的字符串。
思路:
1 使用kmp在s2查找s1,那么终于结束的时候next table的值就是s1前缀和s2的后缀同样的最长的长度了。
2 输入两个字符串s1和s2。那么就能够在s2中查找s1。得到长度len1,s1中查找s2,得到长度len2,比較len1和len2的长短,就能够确定输出哪个字符串了。
const int MAX_N = (int)1E5 + 1;
char s1[MAX_N], s2[MAX_N];
int L1, L2, nxt[MAX_N]; void genTbl(char *str, int len)
{
memset(nxt, 0, sizeof(int) * len);//又一个忘记清零错误
for (int i = 1, j = 0; i < len; )
{
if (str[i] == str[j]) nxt[i++] = ++j;
else if (j > 0) j = nxt[j-1];
else i++;//不清零,也能够nxt[i++] = 0;前面写nxt[0] = 0;
}
} void getLongestPreSuf(int &j, char *str1, char *str2, int len1, int len2)
{
genTbl(str1, len1);
j = 0;
int i = 0;
for (; i < len2; )
{
if (str2[i] == str1[j]) i++, j++;
else if (j > 0) j = nxt[j-1];
else i++;
}
} void printStr(char *str1, char *str2, int l1, int l2, int len)
{
for (int i = 0; i < l1; i++) putchar(str1[i]);
for (int i = len; i < l2; i++) putchar(str2[i]);
putchar('\n');
} int main()
{
while (scanf("%s", s1) != EOF)
{
scanf("%s", s2);
L1 = strlen(s1);
L2 = strlen(s2);
int len1 = 0, len2 = 0;
getLongestPreSuf(len1, s1, s2, L1, L2);
getLongestPreSuf(len2, s2, s1, L2, L1);
if (len1 < len2)
{
//printStr(s1, s2, L1, L2, len2);
printf("%s%s\n", s1, s2+len2);
}
else if (len2 < len1)
{
//printStr(s2, s1, L2, L1, len1);
printf("%s%s\n", s2, s1+len1);
}
else
{
//if (strcmp(s1, s2) < 0) printStr(s1, s2, L1, L2, len2);
//else printStr(s2, s1, L2, L1, len1);
if (strcmp(s1, s2) < 0) printf("%s%s\n", s1, s2+len2);
else printf("%s%s\n", s2, s1+len1);
}
}
return 0;
}
版权声明:笔者靖心脏。景空间地址:http://blog.csdn.net/kenden23/。只有经过作者同意转载。
HDU 1867 A + B for you again KMP解决问题的方法的更多相关文章
- HDU 1867 A + B for you again ----KMP
题意: 给你两个字符串,输出他们合并之后的字符串,合并的时候把A的后缀和B的前缀重叠合(或者把A的前缀和B的后缀重合).要求合并后的串既包含A右包含B, 且使得合并后的字符串尽量短,其次是使得合并后的 ...
- HDU 1618 Oulipo KMP解决问题的方法
鉴于两个字符串,寻找一个字符串的频率,另一个字符串出现. 原版的kmp另一个陷阱.以下凝视了,标不是踩着好,有加班一定几率,也有机会错误,根据不同的字符串可以是详细. 变化看起来像一个,kmp速度是非 ...
- POJ 3450 Corporate Identity KMP解决问题的方法
这个问题,需要一组字符串求最长公共子,其实灵活运用KMP高速寻求最长前缀. 请注意,意大利愿父亲:按照输出词典的顺序的规定. 另外要提醒的是:它也被用来KMP为了解决这个问题,但是很多人认为KMP使用 ...
- HDU 1711 Number Sequence (字符串匹配,KMP算法)
HDU 1711 Number Sequence (字符串匹配,KMP算法) Description Given two sequences of numbers : a1, a2, ...... , ...
- HDU 2087 HDU 1867 KMP标准模板题
贴两道题,其中HDU2087是中文题,故不解释题目, 思路是,一发KMP,但是特别处理最后一位的失配边为0,这样就可以保证“判断完成但是不多判断”. 第二题,很毒瘤的题,要求求出,给定字符串A,B能够 ...
- A + B for you again HDU - 1867(最大前缀&最大后缀的公共子缀&kmp删除法)
Problem Description Generally speaking, there are a lot of problems about strings processing. Now yo ...
- Hdu 1867 KMP
题目链接 题目意思: 给出两个字符串a, b, 求最长的公共字串c, c是a的后缀,也是b的前缀. 本题没有具体说明哪个字符串是文本串和匹配串, 所以都要考虑 思路: 查找的时候, 当文本串结束的时候 ...
- hdu 1867 求两个串的"和"最小 ,KMP
题意: 给你两个字符串,让你求str1+str2,就是把1的后面和2的前面重叠的地方只显示一遍就行了 abc + bcd = abcd,要求和的长度最小,和最小的前提下求字典序最小,还有就 ...
- HDU 1867 A + B for you again(KMP算法的应用)
A + B for you again Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
随机推荐
- js静态私有变量(将方法变成原型模式,被所有实例共享,而方法操作变量,故变量是静态)
js静态私有变量(将方法变成原型模式,被所有实例共享,而方法操作变量,故变量是静态) 一.总结 1.js函数中的private和public:js函数中的私有变量 var 变量名,公有变量 this. ...
- POJ 3628 Bookshelf 2 0-1背包
传送门:http://poj.org/problem?id=3628 题目看了老半天,牛来叠罗汉- -|||和书架什么关系啊.. 大意是:一群牛来叠罗汉,求超过书架的最小高度. 0-1背包的问题,对于 ...
- c#之mysql四种带事务批量插入
前言 对于像我这样的业务程序员开发一些表单内容是家常便饭的事情,说道表单 我们都避免不了多行内容的提交,多行内容保存,自然要用到数据库,如果循环打扰我数据库,数据库也会觉得很累,从而增加数据库服务器压 ...
- AndroidAnnotations使用说明书—AndroidAnnotations是怎样工作的?
AndroidAnnotations的工作方式非常easy.它使用标准的java注入处理工具,自己主动加入了一个额外的编译步骤来生成源码. 源代码是什么?每个增强的类,比方每个用@EActivity注 ...
- Helloworld之Spring依赖注入/控制反转(DI/IoC)版
Helloworld之Spring依赖注入/控制反转(DI/IoC)版 作者:雨水, 日期:2014-10-29 摘要:本文主要用于培训刚開始学习的人理解Spring中的依赖注入的基本概念. 先介绍依 ...
- https://www.cyberciti.biz/faq/howto-change-rename-user-name-id/
https://www.cyberciti.biz/faq/howto-change-rename-user-name-id/
- 【44.10%】【codeforces 723B】Text Document Analysis
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- Perl读写Excel简单操作
Perl读写Excel简单操作 使用模块 Spreadsheet::ParseExcel Spreadsheet::WriteExcel 读Excel #!/usr/bin/perl -w use s ...
- 高性能 Python —— vectorization
首先来看一段判断一个整数数是否为素数的函数,然后从计算机内部计算流程的角度对其进行分析: import math def check_prime(number): sqrt_number = math ...
- Android String与十六进制数互转
/** * 字符串转换成十六进制字符串 * @param String str 待转换的ASCII字符串 * @return String 每个Byte之间空格分隔,如: [61 6C 6B] */ ...