题意 : 给你一个包含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. C++:补齐函数编写递归函数计算x的y次幂(hhhh函数 !头疼!)

    编写递归函数计算x的y次幂,在主程序中输入非零整数x和整数y,输出求幂的结果(保留两位小数).考虑y为负数和0的情况. #include<iostream> #include<iom ...

  2. 6.文件所有权和权限----免费设置匿名----Windows键盘记录器----简介和python模块

    文件所有权和权限 touch --help cd Desktop mkdir Folder cd Folder clear touch Test1 Test2 Test3 Test4 ls ls -l ...

  3. oracle数据库表空间创建&导入&导出

    1.表空间创建 --删除表空间 drop tablespace EVPBDMGIS including contents and datafiles; --删除用户 drop user EVPBDMG ...

  4. Scrapy输出文件格式问题汇总

    Q:Scrapy抓取的内容(包含中文)输出到JSON Lines文件时如何确保输出的是字符本身而不是其unicode编码? A:默认的JsonLinesItemExporter其ensure_asci ...

  5. PhoneGap学习网址

    官网:http://app-framework-software.intel.com/ 下载地址:http://download.csdn.net/download/haozq2012/7635951

  6. java8----Predicate接口的使用

    //5.lambda表达式中加入Predicate // 甚至可以用and().or()和xor()逻辑函数来合并Predicate, // 例如要找到所有以J开始,长度为四个字母的名字,你可以合并两 ...

  7. MySQL-快速入门(6)连接查询、子查询、正则表达式查询、数据的插入删除更新

    1.内连接查询:inner join ... on 只有满足条件的记录才能够出现在结果关系中,即完全相等.自连接查询是一种特殊的内连接查询. 2.外连接查询: 1>左外连接 / 左连接:返回包括 ...

  8. Redis哨兵功能与集群搭建

    6.redis哨兵功能 Redis-Sentinel Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果master本身宕机, ...

  9. 线性渐变css

    从上到下的线性渐变: #grad { background: -webkit-linear-gradient(red, blue); /* Safari 5.1 - 6.0 */ background ...

  10. 2019-11-28-win10-uwp-提示-Cannot-find-a-Resource-with-the-Name-Key-找不到资源

    title author date CreateTime categories win10 uwp 提示 Cannot find a Resource with the Name Key 找不到资源 ...