hdu 1867 求两个串的"和"最小 ,KMP
题意:
      给你两个字符串,让你求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的更多相关文章
- SPOJ 1811 Longest Common Substring(求两个串的最长公共子串 || 或者n个串)
		
http://www.spoj.com/problems/LCS/ 题目:求两个串的最长公共子串 参考:https://www.cnblogs.com/autoint/p/10345276.html: ...
 - 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
		
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
 - SPOJ 1811 Longest Common Substring (后缀自动机第一题,求两个串的最长公共子串)
		
题目大意: 给出两个长度小于等于25W的字符串,求它们的最长公共子串. 题目链接:http://www.spoj.com/problems/LCS/ 算法讨论: 二分+哈希, 后缀数组, 后缀自动机. ...
 - hdu 5120 (求两圆相交的面积
		
题意:告诉你两个圆环,求圆环相交的面积. /* gyt Live up to every day */ #include<cstdio> #include<cmath> #in ...
 - POJ 2774 求两个串的最长公共前缀 | 后缀数组
		
#include<cstdio> #include<algorithm> #include<cstring> #define N 200005 using name ...
 - HDU 1171 Big Event in HDU【01背包/求两堆数分别求和以后的差最小】
		
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
 - hdu 5120(求两个圆环相交的面积  2014北京现场赛 I题)
		
两个圆环的内外径相同 给出内外径 和 两个圆心 求两个圆环相交的面积 画下图可以知道 就是两个大圆交-2*小圆与大圆交+2小圆交 Sample Input22 30 00 02 30 05 0 Sam ...
 - hdu 2857:Mirror and Light(计算几何,点关于直线的对称点,求两线段交点坐标)
		
Mirror and Light Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
 - HDU 6625 three arrays 求两个序列异或最小值的排列(一个可以推广的正解
		
目录 题意: 解析 原题描述 字典树动态求Mex @(hdu 6625求两个序列异或最小值的排列) 题意: \(T(100)\)组,每组两个长度为\(n(100000)\)的排列,你可以将\(a[]\ ...
 
随机推荐
- LeetCode-二叉搜索树的范围和
			
二叉搜索树的范围和 LeetCode-938 首先需要仔细理解题目的意思:找出所有节点值在L和R之间的数的和. 这里采用递归来完成,主要需要注意二叉搜索树的性质. /** * 给定二叉搜索树的根结点 ...
 - 【转载】关于grad_tensors的解惑
			
转载:https://www.cnblogs.com/marsggbo/p/11549631.html 平常都是无脑使用backward,每次看到别人的代码里使用诸如autograd.grad这种方法 ...
 - let、const、var区别?
			
let.const.var区别? let和const不存在变量提升(没有预解析,var有预解析). let和const在同一作用域范围内不能重复定义变量.(var可以). let和const有严格的作 ...
 - docker+compose+nginx+php
			
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. 我用docker做什么? 快速搭建开发所需环境,测试实验新 ...
 - LNMP配置——Nginx配置 ——域名重定向
			
一.配置 #vi /usr/local/nginx/conf/vhost/test.com.conf 写入: server { listen 80; server_name test.com test ...
 - Java 树结构实际应用 一(堆排序2秒排完800w数据)
			
堆排序 1 堆排序基本介绍 1) 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复 杂度均为 O(nlogn),它也是不稳定排序. 2) 堆是具有以下性 ...
 - 【odoo14】第二章、管理odoo实例
			
本章主要介绍肖odoo实例添加用户自定义的模块.你可以从多个路径载入模块.但是建议你将自己的模块儿放在特定的目录当中,避免与odoo的核心模块混淆. 在这一章节,中我们主要涉及以下内容: 配置插件路径 ...
 - asp.net core 实现支持自定义 Content-Type
			
asp.net core 实现支持自定义 Content-Type Intro 我们最近有一个原本是内网的服务要上公网,在公网上有一层 Cloudflare 作为网站的公网流量提供者,CloudFla ...
 - java 动态规划解决上楼梯问题
			
问题描述: 你正在爬楼梯. 它需要n步才能达到顶峰. 每次你可以爬1或2步. 您可以通过多少不同的方式登顶? 注意:给定n将是一个正整数. Example 1: Input: 2 Output: 2 ...
 - 从yield到yield from再到python协程
			
yield 关键字 def fib(): a,b = 0,1 while 1: yield b a,b = b,a+b yield是在:PEP 255 -- Simple Generators 这个p ...