7-6 赛博黑客

文章讲述了在赛博朋克2077的游戏背景下,黑客如何通过组合两个魔偶代码,通过在长代码中插入短代码来尝试使不稳定魔偶变得稳定,以实现网络入侵。涉及字符串操作和判断稳定魔偶的规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

在赛博朋克2077的夜之城,网络黑客们可以在入侵敌人协议时利用一种被称为“魔偶”的数字序列来渗透控制敌人,而技术高超的网络监察则努力破解这些魔偶代码,以保护关键信息不被窃取。魔偶(长度为k)如果满足对于所有的i (1≤i≤k−1),有 ai​=ai+1​,则被认为是“稳定”的,能够有效地穿透黑墙的防御。例如,11010101都是稳定的魔偶,而111001001100则不是。
作为一名黑客,你发现了一种潜在的攻击方法:将两个魔偶代码组合,通过将一个短代码t插入另一个长代码s的任意位置(可以进行一次或多次操作,也可以不进行操作),来形成一个稳定的魔偶。你的目标是编写一个程序,判断是否有可能通过这种方式将s转化为稳定的魔偶代码,进而入侵敌人。

输入格式:

首先输入一个整数T表示测试案例的数量。
对于每一组测试数据,首先输入两个整数n和m,代表两个幽灵代码的长度。接下来输入两个字符串s和t,代表两个幽灵代码。保证s和t的长度分别为n和m (1≤n,m≤100),且只包含字符01

输出格式:

对于每一组输入数据,在一行中输出答案。如果可以通过上述操作使s成为稳定的幽灵代码,输出"YES";否则,输出"NO"。

输入样例:

5
1 1
0
1
2 2
00
11
7 3
010110
010
5 3
10101
000
7 2
1100110
01

输出样例:

YES
NO
YES
YES
NO

样例解释:

在第一组样例中,魔偶s的代码0已经是稳定的魔偶,可以无需进行操作。
在第三组样例中,对于不稳定的魔偶s的代码010110,可以在第四个位置后插入另一个魔偶t代码010,变为0101010​10。
 

代码示例: 

#include<iostream>
#include<string>
using namespace std;
int ismoou(string str){
    char sign;
    if(str[0]=='0')sign='0';
    else sign='1';
    int i;
    for(i=0;i<str.length();i++){
        if(str[i]==sign){
            if(sign=='1')sign='0';
            else sign='1';
            if(i==str.length()-1)return -1;
        }
        else break;
    }
    return i;
}
int main(){
    int t;
    cin>>t;
    for(int i=0;i<t;i++){
        int n,m;
        string s,t;
        cin>>n>>m>>s>>t;
        if(ismoou(s)==-1)cout<<"YES"<<endl;
        else{
            if(ismoou(t)!=-1||t.front()!=t.back())cout<<"NO"<<endl;
            else{
                int sign;
                while(1){
                    sign=ismoou(s);
                    if(t.front()==s[sign]){
                        cout<<"NO"<<endl;
                        break;
                    }
                    else{
                        s.insert(sign,t);
                        if(ismoou(s)==-1){
                            cout<<"YES"<<endl;
                            break;
                        }
                    }
                }
            }
        }
    }
}

代码思路:

 首先定义一个函数ismoou,用来判断一个字符串是否是“魔偶”(即01或10交替出现的字符串),如果是,返回-1,如果不是,返回第一个不符合规则的字符的位置
然后在主函数中,输入测试用例的个数t,对于每个测试用例,输入两个整数n和m,分别表示字符串s和t的长度,以及两个字符串s和t。
对于每个测试用例,首先判断s是否是“魔偶”,如果是,直接输出YES,说明不需要添加t就是魔偶。
如果s不是“魔偶”,则判断t是否是“魔偶”与t的首尾字符是否相同,如果不是“魔偶”或者t的首尾字符不相同,说明s无法添加t使其变成“魔偶”,输出NO;

要添加t使s变成魔偶,t就必须是魔偶,且t的首尾必须相同,要添加t的情况就是s存在两个连续的数字,举两个例子:

10100101中的‘00’,需要插入101.....01这样的魔偶段才能起效

1100101中的‘11’和‘00’,一个需要插入0101.....010,一个需要插入1010.....0101。

只有t的首尾与需要插入两端不同时才能起效


如果t是“魔偶”,且t的首尾字符相同,那么进入一个循环,每次循环中,找到s中第一个不符合规则的字符的位置,记为sign,然后判断t的首字符是否和s[sign](连续相同的片段)相同,如果是,输出NO,表示无法通过添加t来得到“魔偶”。
如果t的首字符和s[sign]不同,那么在s的sign位置插入t,然后判断新的s是否是“魔偶”,如果是,输出YES,表示可以通过添加t来得到“魔偶”。否则继续循环,直到输出YES或NO为止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值