hdu 1867 求两个串的"和"最小 ,KMP
来源:互联网 发布:jquery ajax传递json 编辑:程序博客网 时间:2024/06/08 08:36
题意:
给你两个字符串,让你求str1+str2,就是把1的后面和2的前面重叠的地方只显示一遍就行了 abc + bcd = abcd,要求和的长度最小,和最小的前提下求字典序最小,还有就是两个串可以交换位置的,cdab + abcd = abcdab 而不是 cdabcd,交换位置后合并是最短并且字典序最小的。
思路:
首先得到两个next数组,然后用str1 去匹配 str2,再用str2 去匹配str1,(因为可以交换),分别得到子串走到最后时匹配串的位置,x,y,这个位置也就是重合了多少个,如果x == y说明无论谁在前前面,匹配后的长度都是 l1 + l2 - x(或者 l1 + l2 - y ,x 和 y是相等的),这样我们把字典序小的那个放在前面,另一个把前面的x个字母去掉后接到字典序小的那个串的后面。如果x != y,如果x > y 当然是按照大的那个匹配方式输出了。因为要求的是和的长度最小。
#include<stdio.h>
#include<string.h>
#define N 100000 + 100
int next_a[N] ,next_b[N];
char str_a[N] ,str_b[N];
void get_next(char str[] ,int next[])
{
int j ,k ,m;
m = strlen(str);
j = 0 ,k = -1;
next[0] = -1;
while(j < m)
{
if(k == -1 || str[j] == str[k])
next[++j] = ++k;
else
k = next[k];
}
return;
}
int KMP(char str1[] ,char str2[] ,int next[])
{
int n ,m ,i ,j;
n = strlen(str1);
m = strlen(str2);
for(i = j = 0 ;i < n ;)
{
if(str1[i] == str2[j])
{
i ++ ,j ++;
}
else
{
j = next[j];
if(j == -1)
{
j = 0;
i ++;
}
}
}
return j;
}
int main ()
{
while(~scanf("%s %s" ,str_a ,str_b))
{
get_next(str_a ,next_a);
get_next(str_b ,next_b);
int x = KMP(str_a ,str_b ,next_b);
int y = KMP(str_b ,str_a ,next_a);
if(x == y)
{
if(strcmp(str_a ,str_b) <= 0)
printf("%s%s\n" ,str_a ,str_b + x);
else
printf("%s%s\n" ,str_b ,str_a + x);
}
else
{
if(x > y)
printf("%s%s\n" ,str_a ,str_b + x);
else
printf("%s%s\n" ,str_b ,str_a + y);
}
}
return 0;
}
- hdu 1867 求两个串的"和"最小 ,KMP
- 【HDU 3746】 Cyclic Nacklace 【KMP 求添加最小的个数使串循环】
- hdu 3746 kmp求最小循环节
- HDU 3374 String Problem(KMP求周期+求串最大最小表示法)
- HDU 4333 Revolving Digits【EXKMP求LCP&&KMP求最小循环节(串旋转)】
- 32.求两个序列的和的最小差值
- 求两个数的最小公约数和最小公倍数
- poj2185 KMP+欧几里得 求最小的覆盖
- HDU 3746 Cyclic Nacklace(KMP求最小循环元)
- hdu 3746 Cyclic Nacklace (KMP求最小循环节)
- hdu 3746 Cyclic Nacklace (kmp求最小循环节)
- KMP + 求最小循环节 --- HDU 1358 Period
- hdu 3746 kmp next求最小循环节
- 利用分治法求一组数据中最大的两个数和最小的两个数
- HDU 2087 KMP求匹配串的重复次数
- 求两个自然数的最小公约数
- HDU 1867 KMP 求最大尾部重叠
- hdu 3613 扩展kmp求回文串
- web安全学习笔记之-html5安全
- Windows编译OpenSSL
- ffmpeg快速命令使用
- java中栈和堆内存的区别
- 高通物联网技术解决方案:从汽车到智慧城市
- hdu 1867 求两个串的"和"最小 ,KMP
- mySql数据库
- leetcode第一刷_Balanced Binary Tree
- JDBC连接Mysql并统计指定关键词在某一列中出现的次数
- ubuntu系统下如何禁用笔记本触摸板。
- sphinx 配置文件全解析
- asp.net mvc3 数据验证(二)——错误信息的自定义及其本地化
- python 笔记---set
- asp.net mvc3 数据验证(三)—自定义数据注解