Clairewd’s message

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4300

题意就是给你26的字母的加密方式,然后又给了一个串s1是包含加密后的和没有加密的但是没有加密的可能不齐全;求完整的密文和原文;

例如第二个例子:

      abcdefghijklmnopqrstuvwxyz

加密方式:  qwertyuiopasdfghjklzxcvbnm

  s1:   qwertabcde

在s1中qwert就是密文,后面的abcde就是原文;

假如加密方式不变,s1变成qwertabc,那么答案还是qwertabcde;

密文的长度肯定大于s1总长度的一半,我们可以把s1后一半当成密文前一半不变,然后解密得到s2,那么s2的Next【len】就是明文的长度;

#include<stdio.h>
#include<string.h>

const int MAXN = 2e5+7;
const int oo = 1e9+7;
const int mod = 10007;

char s[MAXN], a[MAXN], pass[MAXN];
int next[MAXN];

void GetNext(char s[], int N)
{
    int i=0, j=-1;
    next[0] = -1;

    while(i < N)
    {
        if(j==-1 || s[i]==s[j])
            next[++i] = ++j;
        else
            j = next[j];
    }
}

int main()
{
    int T;

    scanf("%d", &T);

    while(T--)
    {
        int i, N, Mid;

        scanf("%s%s", s, a);

        for(i=0; s[i]; i++)
        {
            pass[ s[i]-‘a‘ ] = i+‘a‘;
        }

        N = strlen(a);
        Mid = (N+1)/2;

        for(i=0; i<Mid; i++)
            s[i] = pass[ a[i]-‘a‘ ];
        s[i] = ‘*‘, s[i+1]=0;
        strcat(s, a+i);

        GetNext(s, N+1);
        printf("%s\n", s);
        Mid = N-next[N+1];

        for(i=0; i<Mid; i++)
        {
            s[i] = a[i];
            s[i+Mid] = pass[ a[i]-‘a‘ ];
        }
        s[i+Mid] = 0;

        printf("%s\n", s);
    }
    return 0;
}

时间: 2024-10-20 14:53:26

Clairewd’s message的相关文章

hdu 4300 Clairewd’s message (KMP)

给定一个翻译表,即第i个字母用哪个字母表示 再给一个串,里面前面为密文,后面为明文,密文一定是完整的,但明文不完整或可能没有 求这个完整的前面密文后面明文的串 # include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int len; int next[100010]; char a1[100010],a2[100010],a3[100010]; void Ge

HDU 4300 Clairewd&#39;s message ( 拓展KMP )

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

hdu 4300 Clairewd’s message 字符串哈希

Clairewd’s message Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10376    Accepted Submission(s): 3709 Problem Description Clairewd is a member of FBI. After several years concealing in BUPT,

HDU 4300 Clairewd‘s message 拓展KMP入门

HDU 4300 Clairewd's message 拓展KMP入门 题意 原题链接 这个题关键是要读懂题意,我做的时候就没有读懂,泪.题意是说给你的一个两个字符串,一个是26个字母密码表,依次对应替换的字母.然后给你一个字符串,这个字符串是不完整的(完整的应该是前半部分是加密的,后半部分是解密了的),然而,给你的字符串一定是加密的部分+一部分解密的部分(可以是全部,也可以是没有),让你求出最短的完整字符串,包括密文和明文: 解题思路 考虑给出的字符串S加密部分一定全部给出,所以给出的字符串的

HDU 4300 Clairewd’s message

Problem Description Clairewd is a member of FBI. After several years concealing in BUPT, she intercepted some important messages and she was preparing for sending it to ykwd. They had agreed that each letter of these messages would be transfered to a

hdu 4300 Clairewd’s message(详解,扩展KMP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4300 Problem Description Clairewd is a member of FBI. After several years concealing in BUPT, she intercepted some important messages and she was preparing for sending it to ykwd. They had agreed that ea

HDU 4300 Clairewd’s message(扩展KMP)

思路:extend[i]表示原串以第i开始与模式串的前缀的最长匹配.经过O(n)的枚举,我们可以得到,若extend[i]+i=len且i>=extend[i]时,表示t即为该点之前的串,c即为该点之前的str串,最后输出即可. #include<iostream> #include<cstdio> #include<cstring> #include<map> using namespace std; const int N=100010; char

HDU 4300 Clairewd’s message(初遇拓展KMP)

昨晚一不小心学了拓展KMP,被虐了一晚,最终是这份资料救了我...http://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html 说得简单易懂. 然后学了kuangbin的模版: /* * 扩展KMP算法 */ //next[i]:x[i...m-1]与x[0...m-1]的最长公共前缀 //extend[i]:y[i...n-1]与x[0...m-1]的最长公共前缀 void pre_EKMP(char x[],int m,int next[

hdu oj 4300 Clairewd’s message AC code

#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> #include<vector> #include<cassert> using namespace std; int main(void) { int T; cin >> T; while (T--) { string S, msg; while (cin >> S >> msg) {