题意 : 给你一个包含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. 【HANA系列】SAP HANA STUDIO客户端升级更新

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA STUDIO客 ...

  2. springboot(3) 页面到服务器

    第一讲实现了spring boot 环境的下载及配置. 第二讲实现了,从服务器,到页面. 第三讲打算从页面到服务器. 比如,我们希望 从页面,点击一个按钮,传递信息到服务器. 就拿传递用户名和密码来简 ...

  3. 用seborn的函数distplot(), jointplot(), pairplt()对数据的单变量分析绘图

    1.用seaborn的distplot()函数绘制直方图.参数kde = True时会把分布曲线也画出来. 如下代码所示是绘制标准正态分布的分布图 import seaborn as sns impo ...

  4. 爬虫三之beautifulsoup

    基本使用 from bs4 import BeautifulSoup soup = BeautifulSoup(html#,'lxml','xml','html5lib') soup.prettify ...

  5. 【读书笔记】GitHub入门

    代码管理方式--集中与分散 集中型 以 Subversion 为代表的集中型,所示将仓库集中存放在服务器之中,所以只存在一个仓库.这就是为什么这种版本管理系统会被称作集中型. 集中型将所有数据集中存放 ...

  6. python+selenium模拟键盘输入

    from selenium.webdriver.common.keys import Keys #键盘导入类 --------------------------------------------- ...

  7. 不容错过的 MySQL史上最全

    点击下方链接 http://c.biancheng.net/view/2361.html

  8. 蚁群算法解决TSP问题

    代码实现 运行结果及参数展示 alpha=1beta=5 rho=0.1  alpha=1beta=1rho=0.1 alpha=0.5beta=1rho=0.1 概念蚁群算法(AG)是一种模拟蚂蚁觅 ...

  9. SQLSERVER 备份恢复之后提示缺少创建表权限的问题解决

    1. 同事这边出现异常: 执行功能是报错, 这个错误 应该是创建临时表时没有权限触发的. 方法应该很简单 缺少权限增加权限即可 2. 这里需要使用sa 或者是 具有sa权限的用户登录 打开 数据库级别 ...

  10. CM使用MySQL数据库预处理scm_prepare_database.sh执行报错:java.sql.SQLException: Access denied for user 'scm'@'hadoop101.com' (using password: YES)

    1.报错提示: [root@hadoop101 ~]# /opt/module/cm/cm-/share/cmf/schema/scm_prepare_database.sh mysql cm -hh ...