hdu 1867 A + B for you again

题目:

链接:点击打开链接

题意:

找出两个字符串的后缀和前缀公共串,输出最短的串,并且为最小字典序。

算法:

KMP算法。

思路:

取最小字典序输出。。。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 100010

char s1[MAXN],s2[MAXN];
int next[MAXN];

void get_nextval(char s[])//求next数组
{
    int i,j;
    i = -1;
    j = 0;
    next[0] = -1;
    int len = strlen(s);
    while(j<len)
    {
        if(i == -1 || s[i] == s[j])
        {
            j++; i++;
            next[j] = i;
        }
        else
            i = next[i];
    }
}

int KMP(char s1[],char s2[])//返回后缀和前缀的最大相同长度
{
    int i,j;
    i = 0;
    j = 0;
    get_nextval(s2);
    int len1 = strlen(s1),len2 = strlen(s2);
    while(i<len1 && j<len2)
    {
        if(j == -1 || s1[i] == s2[j])
        {
            i++; j++;
        }
        else
            j = next[j];
    }
    if(i == len1)
    {
        return j;
    }
    return 0;
}

int main()
{
    //freopen("input.txt","r",stdin);
    int a,b;
    while(scanf("%s%s",s1,s2) != EOF)
    {
        a = KMP(s1,s2);
        b = KMP(s2,s1);//首先取最短的字符串输出,如果相同,比较字典序即可
        if(a == b)
        {
            if(strcmp(s1,s2)>0)
                printf("%s%s\n",s2,s1+a);
            else
                printf("%s%s\n",s1,s2+a);
        }
        else if(a>b)
        {
            printf("%s%s\n",s1,s2+a);
        }
        else
            printf("%s%s\n",s2,s1+b);
    }
    return 0;
}

hdu 1867 A + B for you again,布布扣,bubuko.com

时间: 2024-08-10 08:10:25

hdu 1867 A + B for you again的相关文章

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/Others) Total Submission(s): 4636    Accepted Submission(s): 1193 Problem Description Generally speaking, there are a lot of problems about strings proces

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

题意: 给你两个字符串,输出他们合并之后的字符串,合并的时候把A的后缀和B的前缀重叠合(或者把A的前缀和B的后缀重合).要求合并后的串既包含A右包含B,且使得合并后的字符串尽量短,其次是使得合并后的字符串字典序尽量小. 分析: 首先A和B合并他们一定是首尾重叠相连,要求合并后字典序最小,所以当合并后串长度一样时,我们要把A或B中字典序小的放在前面. 然后计算A的后缀和B的前缀匹配长度为len1,计算A的前缀和B的后缀匹配长度为len2. 如果len1大,那么就把A放前面.如果len2大,那么就把

Hdu 1867 KMP

题目链接 题目意思: 给出两个字符串a, b, 求最长的公共字串c, c是a的后缀,也是b的前缀. 本题没有具体说明哪个字符串是文本串和匹配串, 所以都要考虑 思路: 查找的时候, 当文本串结束的时候, 返回匹配串的位 1 /************************************************************************* 2 > File Name: 1867.cpp 3 > Author: Stomach_ache 4 > Mail:

HDU 1867 A + B for you again KMP题解

本题又是一个典型的KMP应用. 求两个字符串相加的结果,相加的规律是一个字符串的后缀和另一个字符串的前缀相同,就可以合并这个部分. 不过本题的题意不是很清晰,因为没有太明确指出这两个字符串的出现顺序是无关的,只是需要输出合并后长度最短的结果,如果合并后长度一样,那么就按照字典顺序,输出字典顺序在前的字符串. 思路: 1 使用kmp在s2查找s1,那么最终结束的时候next table的值就是s1前缀和s2的后缀相同的最长的长度了. 2 输入两个字符串s1和s2,那么就可以在s2中查找s1,得到长

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/Others)Total Submission(s): 4496    Accepted Submission(s): 1157 Problem Description Generally speaking, there are a lot of problems about strings process

HDU 专题分类

[背包问题] 2602 Bone Collector 1114 Piggy-Bank 1203 I NEED A OFFER! 1171 Big Event in HDU 1059 Dividing 2844 Coins 2191 悼念512汶川大地震遇难同胞--珍惜现在,感恩生活 2159 FATE 1561 The more, The Better 1011 Starship Troopers 2639 Bone Collector II 3033 I love sneakers! 2955

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往