题意 : 给你一个包含26个小写字母的明文密文转换信息字符串str,第一个表示'a'对应的密文是str[0]、'b'对应str[1]……以此类推。接下来一行给你一个另一个字符串,这个字符串由密文+明文组成,但是现在后面部分的明问可能有不完整的情况(也有可能缺失只包含密文),问你现在最少需要补充多多少个字符串才能使得字符串变成完整的满足==>密文+密文对应的明文 组成的字符串,将这个完整的字符串输出出来。

分析 : 冷静分析一下可以发现,在给出的残缺字符串中,前面的一半肯定是属于密文的!如果不是这样,那明文就会比密文长了,这是不可能的。然后可以发现,后半段的各个后缀,只要找出一个最长的后缀使得其和前面半段的密文对应的明文相匹配,那么我们需要补充的字符串就是最少需要补充的!举个栗子来说就是,比如假设对照表的明文和密文是一样的,也就是'a'就是'a',‘b'就是’b',对于abcdab,先截取前半段 abc 翻译一下得到的明文还是 abc,现在考虑后半段 dab ,现在最长的后缀 dab 是无法与翻译过后的明文相匹配,所以跳过接下来考虑第二长的 ab 这个后缀,发现匹配了因此 ab 即为后半段明文的开始前缀,而我们需要补充的就只有 cd 这个字符串的明文,故答案是 abcdabcd。发现为了完成这个任务,拓展KMP相当合适,只要将前半段作为模板串,后半段作为主串跑一遍拓展KMP,得到extend数组,只要现在满足 i + extend[i] == len 即满足要求,具体看代码。

#include<string.h>
#include<stdio.h>
#include<map>
using namespace std;
;
map<char, char> mp;
char str[maxn], S[maxn], mo[maxn];
int Next[maxn], extend[maxn], moL, strL, len, Hlen;

void GetNext()
{
    Next[] = moL;
    int a, p;
    , j = -; i < moL; i++, j--){
         || i + Next[i - a] >= p){
            ) p = i, j = ;

            while (p < moL && mo[p] == mo[j]) p++, j++;

            Next[i] = j;
            a = i;
        } else Next[i] = Next[i - a];
    }
}

void GetExtend()
{
    GetNext();
    int a, p;
    , j = -; i < strL; i++, j--){
         || i + Next[i - a] >= p){
            ) p = i, j = ;

            while (p < strL && j < moL && S[p] ==  mo[j])
                p++, j++;

            extend[i] = j;
            a = i;
        } else extend[i] = Next[i - a];
    }
}

inline void PrintAns()
{
    GetExtend();
    ;
    ,j=Hlen; i<strL; j++,i++){
        if(j + extend[i] == len){///找最长的前后缀使得其与前半段匹配
            index = j;
            break;
        }
    }

    ) index = len;///如果没有这样的后缀,那么说明原来本身就不包含明文,需要全部补充上去

    bool flag = false;
    ; t<=; t++){
        if(!flag){
            ; i<index; i++)
                putchar(str[i]);
            flag = true;
        }else{
            ; i<index; i++)
                putchar(mp[str[i]]);
        }
    }puts("");
}

int main(void)
{
    int nCase;
    scanf("%d", &nCase);
    while(nCase--){
        mp.clear(); char tmp;
        ; i<; i++){
            scanf(" %c", &tmp);
            mp[tmp] = 'a'+i;///用map构建明文——密文对照表
        }
        scanf("%s", str);
        len = strlen(str);

        Hlen = (len+)/;
        moL = Hlen, strL = len - Hlen;

        ; i<Hlen; i++)
            mo[i] = mp[str[i]];///截取前半段的“译文”作为模板串
        ,i=Hlen; i<len; j++,i++)
            S[j] = str[i];///截取后半段作为母串

        PrintAns();
    }
    ;
}

HDU 4300 Clairewd's message ( 拓展KMP )的更多相关文章

  1. hdu 4300 Clairewd’s message(扩展kmp)

    Problem Description Clairewd is a member of FBI. After several years concealing in BUPT, she interce ...

  2. hdu 4300 Clairewd’s message(kmp/扩展kmp)

    题意:真难懂.. 给出26个英文字母的加密表,明文中的'a'会转为加密表中的第一个字母,'b'转为第二个,...依次类推. 然后第二行是一个字符串(str1),形式是密文+明文,其中密文一定完整,而明 ...

  3. HDU - 4300 Clairewd’s message (拓展kmp)

    HDU - 4300 题意:这个题目好难读懂,,先给你一个字母的转换表,然后给你一个字符串密文+明文,密文一定是全的,但明文不一定是全的,求最短的密文和解密后的明文: 题解:由于密文一定是全的,所以他 ...

  4. hdu 4300 Clairewd’s message KMP应用

    Clairewd’s message 题意:先一个转换表S,表示第i个拉丁字母转换为s[i],即a -> s[1];(a为明文,s[i]为密文).之后给你一串长度为n<= 100000的前 ...

  5. hdu 4300 Clairewd’s message 字符串哈希

    Clairewd’s message Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  6. hdu 4300 Clairewd’s message(具体解释,扩展KMP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4300 Problem Description Clairewd is a member of FBI. ...

  7. HDU 4300 Clairewd’s message(KMP+思维)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4300 题目大意:题目大意就是给以一段字符xxxxzzz前面x部分是密文z部分是明文,但是我们不知道是从 ...

  8. HDU 4300 Clairewd’s message(扩展KMP)

    思路:extend[i]表示原串以第i開始与模式串的前缀的最长匹配.经过O(n)的枚举,我们能够得到,若extend[i]+i=len且i>=extend[i]时,表示t即为该点之前的串,c即为 ...

  9. HDU 4300 Clairewd’s message(扩展KMP)题解

    题意:先给你一个密码本,再给你一串字符串,字符串前面是密文,后面是明文(明文可能不完成整),也就是说这个字符串由一个完整的密文和可能不完整的该密文的明文组成,要你找出最短的密文+明文. 思路:我们把字 ...

随机推荐

  1. 嵌套的frame

    自动化的测试中,iframe的嵌套也是很常见的,对于嵌套的iframe,我们处理的方式是先进入到iframe的父节点, 再进入到子节点,然后可以对子节点里面的对象进行处理和操作.如下的html代码效果 ...

  2. 应用安全 - CMS - vBulletin漏洞汇总

    SSV-15384 Date: 2004.11 漏洞类别: SQL 注入 SSV-15476 Date: 2005.2 漏洞类别: RCE SSV-15482 Date: 2005.2 类型: RCE ...

  3. 伯努利分布、二项分布、多项分布、Beta分布、Dirichlet分布

    1. 伯努利分布 伯努利分布(Bernoulli distribution)又名两点分布或0-1分布,介绍伯努利分布前首先需要引入伯努利试验(Bernoulli trial). 伯努利试验是只有两种可 ...

  4. Cassandra视图

    一.简介 Cassandra作为一个P2P结构的NOSQL数据库,使用与HBase不同的去中心化架构,在国外使用非常广泛,受欢迎程度甚至在Hbase之上.今天这篇文章介绍Cassandra在视图方面设 ...

  5. CentOS下搭建docker+.net core

    运行环境: CentOS 7.0 容器:Docker 1.13.1 .Net Core版本: .NET Core 2.1,安装详见 CentOS 7 下安装.NET Core SDK 2.1 1.安装 ...

  6. Linux0.11之初识Makefile/build.c

    前言 Makefile对于从来没有接触过的人来说是相当别扭的(比如我),但它确实又是非常重要的,它描述了一个Image是如何形成的,理解它也许并不能帮我解决实际问题,而且编写Makefile的工作也许 ...

  7. ThinkPHP5 与 composer

    我是通过安装composer来获取tp5安装的,也是学习一下 在 Windows 中,你需要下载并运行 Composer-Setup.exe. 安装时,要选择本地环境中php.exe作为跟目录,这个可 ...

  8. ubuntu或linux下找不到apache服务器配置文件httpd.conf

    原因是ubuntu中是apache2,没有httpd.conf文件,所有找不到. 我的是ubuntu14.04系统,apache2配置文件在/etc/apache2/apache2.conf中, 如果 ...

  9. Python 入门之常用运算符

    Python 入门之常用运算符 Python中的运算按种类可分为算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算 1.常用运算符: (1)算数运算符: + - * / %(取余(模) ...

  10. js实现404页面倒计时跳转

    <script type="text/javascript"> (function(){ var i=5,timer=null,number=document.getE ...