码迷,mamicode.com
首页 > 其他好文 > 详细

Clairewd’s message

时间:2015-09-26 18:31:58      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

题目链接: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;
}
View Code

 

Clairewd’s message

标签:

原文地址:http://www.cnblogs.com/zhengguiping--9876/p/4840976.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!