题意 : 给你一个包含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. win10在文件夹下打开powershell

    快捷键win+R,输入cmd可以直接打开终端命令行窗口 在文件夹下打开终端命令行端口: 在需要的文件夹目录下,按住shift键,在空白处右击,选择在此处打开powershell窗口,即可进行终端命令行 ...

  2. springBoot(1) 环境安装

    真鸡儿要命.今天做开发.实在是整不动了...所以决定回家,干一波... 发现MyEclipse2014好像真的不用能用了... 瞬间焦头烂额,本来,就跑不了.现在环境也没一个能用的. 于是 就有了今天 ...

  3. [Mac Terminal] ___切换到其他路径和目录

    如果你想将当前 command line 会话切换到其他目录,需要用到三个命令:pwd,ls和cd. pwd的含义是“print working directory”,会显示当前目录的绝对路径.ls的 ...

  4. kafka学习(四)

    集群成员关系 kafka使用Zookeeper 来维护集群成员的信息.每个broker都有一个唯一标识符,这个标识符可以在配置里指定,也可以自动生成.在broker启动的时候,它通过创建临时节点把自己 ...

  5. 红帽学习笔记[RHCSA] 第五课[用户、权限相关]

    第五课 用户权限 查看文件的权限 [kane@localhost /]$ ll total 36 ----------. 1 root root 1751 Aug 22 20:58 ~ lrwxrwx ...

  6. SwipeRefreshLayout和RecyclerView类

    1 SwipeRefreshLayout和RecyclerView之间的关系 内容栏上下滚动是RecyclerView控制的,只有当内容栏滑动到最顶上时,再也拉不动了的时候,这个时候将动作交给Swip ...

  7. Hibernate-Criteria学习笔记

    hibernate_jpa注解 目前最新版的hibernate,5.2,底层整合了jpa,用idea的hibernate工具生成实体时,实体包含了注解的配置文件,缺一不可 如,用户类实体,生成之后是这 ...

  8. ls 命令通配符(3)

    使用过正则的人应该很熟悉通配符.如果非要解释的话,我找来一段: 通配符是一种特殊语句,主要有星号(*)和问号(?),用来模糊搜索文件. 当查找文件夹时,可以使用它来代替一个或多个真正字符:当不知道真正 ...

  9. java基础笔记(11)

    css 样式的设置主要有选择器+声明{}:声明里又分为属性和值: 注释代码:/*注释语句*/ 内联式:写在元素开始的标签里:例:<p style = "color:red;font-s ...

  10. P1622释放囚犯

    这是一道绿题,是一道让人想用贪心但却是区间DP的题目,难倒了我这个蒟蒻. 这个题其实仔细观察是类似于石子合并的!合并石子的代价便是肉的数量,求最小代价.所以我们设dp[i][j]为释放第i个到第j个所 ...