MC0113 双回文串&&MC0114 甄别情报

MC0113 双回文串

题目

难度:白银 时间限制:1秒 占用内存:128M

回文串是一类正着读和倒着读都一样的字符串,如 ababa,acca,a都为回文串,而 ef,aac 不是回文串。

现在定义一个字符串若为双回文串,则可以将这个字符串划分为两个非空子串,并且这两个非空子串都为回文串。一个字符串的非空子串指的是这个字符串内部连续的一段长度大于等于 11 的字符串。具体地来讲,若一个长度为n(n>=2)的字符串S01..n-1是双回文串,则可以找到一个i(1<=i<=n-1),满足子串S0..i-1和Si...n-1 均为回文串。

现在小码哥手上有一些字符串,他想你来帮他判断一下,哪些字符串是双回文串,哪些字符串不是呢。

格式

输入格式:

输入一行仅包含小写字母的字符串 s,保证其长度 n满足 2≤n≤1000。

输出格式:

若这个字符串为双回文串,则输出 YES,否则输出 NO。

算法思想:

要判断一个字符串是否是双回文串,我们可以遍历字符串的所有可能的划分方式,然后判断划分出来的两个子串是否都是回文串。下面这段代码通过遍历所有可能的划分方式,检查每个划分出来的子串是否都是回文串,来判断原字符串是否是双回文串。虽然这种方法在解空间很大的情况下可能不太高效,但对于本题给定的范围来说,可以找到正确的答案。

代码:

#include<stdio.h>
#include<string.h>
char a[1001];
int judge(int k,int j){
    while(k<=j){
        if(a[k]!=a[j]){
            return 0;
            break;
        }
        k++;
        j--;
    }
    return 1;
}
int main() 
{ 
    int b=0;
    scanf("%s",a);
    for(int i=0;i<strlen(a);i++){
        for(int j=i+1;j<strlen(a);j++){
            if(judge(i,j)&&judge(j,strlen(a)-1)&&b!=1){
                printf("YES");
                b=1;
                break;
            }
        }
    }
    if(b==0){
        printf("NO");
    }
    return 0; 
}

MC0114 甄别情报

题目

难度:白银 时间限制:1秒 占用内存:128M

小码哥凭借自己炉火纯青的编程技能和在密码学领域的极深的造诣,实现了小时候的梦想——成为情报部门的一名技术人员。

最近,小码哥接到了上级的一个任务:甄别一些情报是否可能有效。

具体来说,敌国的每条消息都是一个由小写英文字母组成的字符串,敌国会采取一种简单的加密方式对每条消息进行加密。

流程如下:先制作一个小写字母表到大写字母表的一一映射(注意是一一映射,前后有一一对应的关系,比如说你规定a映射到B,就不能再规定a映射到C,也不能再规定c映射到B),然后对字符串里面的每个字符按照映射表替换,得到一个新的字符串,称为密文。

小码哥收到的每条情报由两个等长的字符串组成,前者由小写字母组成,表示一条消息,后者由大写字母组成,表示密文。小码哥的任务是判断,后者是否可能是前者通过敌国的那种加密方式得到的。举一些例子:abb可以加密成BCC,但是abb不可能加密成BCD,因为b只能与一个大写字母对应;同理,abc也不可能加密成BCC,因为C只能与一个小写字母对应。

你也来体验体验小码哥的工作吧!

格式

输入格式:

输入的第一行为一个整数t(1≤t≤100),表示小码哥需要处理的情报条数。
接下来t行,每行有两条由空格隔开的字符串,含义如题意所示。
保证每条字符串的长度小于100。

输出格式:

输出共t行。
对于每条情报,如果后面的密文可能由前面的消息通过敌国的那种加密方式得到,则输出YES,否则输出NO。每条输出占一行。

算法思想:

要解决这个问题,我们需要检查每个密文字符与其对应的消息字符之间的关系是否满足题目描述中敌国的加密方式。下面这段代码通过比较消息字符串和密文字符串中对应位置字符之间的差值来判断是否满足敌国的加密方式,如果所有字符的差值都相等,则说明满足条件。

代码

#include<stdio.h>
int main() 
{ 
    int t;
    char a[101];
    char b[101];
    int c[101]={0};
    scanf("%d",&t);
    for(int i=0;i<t;i++){
        scanf("%s %s",a,b);
        int temp=0;
        for(int i=0;i<strlen(a);i++){
            for(int j=0;j<=i;j++){
                if(a[j]==a[i]||b[j]==b[i]){
                    if(b[j]-a[j]!=b[i]-a[i]){
                        temp=1;
                    }
                }
            }
        }
        if(temp==0){
            printf("YES\n");
        }else{
            printf("NO\n"); 
        }

    }
    return 0; 
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钻仰弥坚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值