我的Vijos学习笔记——P1449 字符串还原

P1449 字符串还原

背景

小K是一位蔚蓝教主的崇拜者(Orz教主er),有一天,他收到了一封匿名信,信告诉了小K由于他表现出色,得到了一次当面Orz教主的机会,但是要当面Orz教主可不那么容易,不是每个人都有资格Orz教主的。所以要破解下面一段密文才可以得到相关的信息,信中有提供加密的规则,但是小K觉得这个问题看似复杂,所以想请你帮忙。

描述

一个长度为n的由小写字母组成的字符串 s1s2s3sn s 1 s 2 s 3 … s n 按如下方式加密成3种形式:
1、将字符串翻转,即对于每一个 1in 1 ≤ i ≤ n 来说, si s i sni+1 s n − i + 1 对换。
2、将字符串中每个字母变为其之后第k个字母,定义z之后的字母为a,其中0≤k≤6且为未知数。
3、将字符串中每个字母变为其之前第k个字母,定义a之前的字母为z,k同2所述。
例如字符串abcd按上面3种方式加密后,在k=1的情况下会依次变为:
1、dcba;
2、bcde;
3、zabc。
现给出信中按以上3种形式分别加密后的3个字符串(不一定按上述例子的顺序),要求还原原来的字符串,并输出告诉小K。

格式

输入格式

输入的第1行为一个整数n,表示这个字符串的长度。
下面3行每行1个长度为n的字符串,且保证符合题目要求。

输出格式

输出仅包括1行,为还原后的字符串。

样例1

样例输入1

4
zabc
dcba
bcde
Copy

样例输出1

abcd

限制

对于10%的数据,输入给出加密字符串的顺序同题目中1、2、3的顺序。
对于20%的数据,n≤5;
对于40%的数据,n≤10;
对于60%的数据,n≤255;
对于100%的数据,n≤10000。
时限1s

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int n;
int match(char* s1,char* s2,char* s3)
{
    //S1为颠倒,S2为加K所得,S3为减K所得
    char *tem1,*tem2,*tem3;
    int i,k;
    tem1=(char*)malloc(n*sizeof(char));
    tem2=(char*)malloc(n*sizeof(char));
    tem3=(char*)malloc(n*sizeof(char));
    //cope with s1
    for(i=0;i<n;i++)
    {
        *(tem1+i)=*(s1+n-1-i);
    }
    for(k=0;k<=6;k++)
    {
        for(i=0;i<n;i++)
        {
            *(tem2+i)=(*(s2+i)-97-k+26)%26+97;
            *(tem3+i)=(*(s3+i)-97+k)%26+97;
        }
        if(strcmp(tem1,tem2)==0&&strcmp(tem1, tem3)==0)
        {
            printf("%s\n",tem1);
            return 1;
        }
    }
    return 0;
}
int main()
{
    char *str1,*str2,*str3;
    scanf("%d",&n);
    str1=(char*)malloc(n*sizeof(char));
    str2=(char*)malloc(n*sizeof(char));
    str3=(char*)malloc(n*sizeof(char));
    scanf("%s\n%s\n%s",str1,str2,str3);
    if(match(str1, str2, str3)==0)
    {
        if(match(str1,str3,str2)==0)
        {
            if(match(str2, str1, str3)==0)
            {
                if(match(str2, str3, str1)==0)
                {
                    if(match(str3, str1, str2)==0)
                    {
                        match(str3,str2,str1);
                    }
                }
            }
        }
    }
    return 0;
}

注意事项

无,题目非常简单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值