这是一个典型问题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解决问题的方法的更多相关文章

  1. HDU 1867 A + B for you again ----KMP

    题意: 给你两个字符串,输出他们合并之后的字符串,合并的时候把A的后缀和B的前缀重叠合(或者把A的前缀和B的后缀重合).要求合并后的串既包含A右包含B, 且使得合并后的字符串尽量短,其次是使得合并后的 ...

  2. HDU 1618 Oulipo KMP解决问题的方法

    鉴于两个字符串,寻找一个字符串的频率,另一个字符串出现. 原版的kmp另一个陷阱.以下凝视了,标不是踩着好,有加班一定几率,也有机会错误,根据不同的字符串可以是详细. 变化看起来像一个,kmp速度是非 ...

  3. POJ 3450 Corporate Identity KMP解决问题的方法

    这个问题,需要一组字符串求最长公共子,其实灵活运用KMP高速寻求最长前缀. 请注意,意大利愿父亲:按照输出词典的顺序的规定. 另外要提醒的是:它也被用来KMP为了解决这个问题,但是很多人认为KMP使用 ...

  4. HDU 1711 Number Sequence (字符串匹配,KMP算法)

    HDU 1711 Number Sequence (字符串匹配,KMP算法) Description Given two sequences of numbers : a1, a2, ...... , ...

  5. HDU 2087 HDU 1867 KMP标准模板题

    贴两道题,其中HDU2087是中文题,故不解释题目, 思路是,一发KMP,但是特别处理最后一位的失配边为0,这样就可以保证“判断完成但是不多判断”. 第二题,很毒瘤的题,要求求出,给定字符串A,B能够 ...

  6. A + B for you again HDU - 1867(最大前缀&最大后缀的公共子缀&kmp删除法)

    Problem Description Generally speaking, there are a lot of problems about strings processing. Now yo ...

  7. Hdu 1867 KMP

    题目链接 题目意思: 给出两个字符串a, b, 求最长的公共字串c, c是a的后缀,也是b的前缀. 本题没有具体说明哪个字符串是文本串和匹配串, 所以都要考虑 思路: 查找的时候, 当文本串结束的时候 ...

  8. hdu 1867 求两个串的"和"最小 ,KMP

    题意:       给你两个字符串,让你求str1+str2,就是把1的后面和2的前面重叠的地方只显示一遍就行了 abc + bcd = abcd,要求和的长度最小,和最小的前提下求字典序最小,还有就 ...

  9. 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 ...

随机推荐

  1. Android中ImageView.ScaleType属性值

    1 android:scaleType="center" (1)当图片大于ImageView的宽高:以图片的中心点和ImageView的中心点为基准,按照图片的原大小居中显示,不缩 ...

  2. js cookie可选参数(document.cookie='name=张三;expires='+day;)

    js cookie可选参数(document.cookie='name=张三;expires='+day;) 一.总结 1.可用secure属性来设置安全协议传输 2.expire属性用的比较多,其它 ...

  3. ANSCII码和BCD码互转

    bool AtoBCD(unsigned char* Asc,unsigned char* BCD,int len) { int i; unsigned char ch; //高位 unsigned ...

  4. 线程堆栈大小 pthread_attr_setstacksize 的使用

    pthread_create 创建线程时,若不指定分配堆栈大小,系统会分配默认值,查看默认值方法如下: # ulimit -s8192# 上述表示为8M:单位为KB. 也可以通过# ulimit -a ...

  5. docker 在运行 aspnetcore 镜像时提示 命令找不到

    不要讲路径映射到镜像中的应用根文件夹 例如默认的 /app

  6. 【TP SRM 703 div2 250】AlternatingString

    Problem Statement A string of zeros and ones is called an alternating string if no two adjacent char ...

  7. Struts2与Spring的整合

    今天倒腾了半天,终于是把这个两个框架整合到一起了.还是要写一下总结,同时给大家一些帮助. 开发环境:myeclipse 9.0(不好用!)tomcat6.0 1.准备工作 需要导入的包:struts2 ...

  8. C# WebQQ协议群发机器人(一)

    原创性申明 本文地址 http://blog.csdn.net/zhujunxxxxx/article/details/38931287 转载的话请注明出处. 之前我也写过一篇使用python来实现的 ...

  9. oracle dual表

    dual是个虚表,其仅仅有一列. 当查询时间或者日期这些对象的时候就须要使用这个表. 比如: select sysdate from dual; 由于在oracle其中,查询语句必需要有keyword ...

  10. Oracle中的sid与servicename

    在平时自己创建库的时候,习惯的将sid与servicename取同名,但是在实际生产中这两个名字很有可能不一致,再使用jdbc连接数据库的url时就需要注意区分了,否则创建不了数据库连接 //serv ...