每日一题 赛博黑客

题目描述:

在赛博朋克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。

思路讲解:

简单来说,就是给你两个字符串,s1,s2,然后判断s1是不是满足相邻数字是不是不同的(即是不是0101或者1010来排的),如果不行就把s2插入,如果还是不行,就继续插入直到满足为止,如果一直到遍历到s1最后的一个字符都还没有满足,那么就直接输出no,反之输出Yes,

  if ((s1[i] == '0' && s1[i + 1] == '0' )|| (s1[i] == '1' && s1[i + 1] == '1'))
                {
                    s1.insert(i+1, s2);
                    n += m;
                    i += m;
                }
            }

上面代码有一个比较细节的地方就是在插入s2的那一段的遍历当中,在遍历之后要吧遍历的次数(s1.lengthj())加上s2,并把当前遍历的次数加上s2.length()

判断是不是稳定的幽灵代码,直接遍历一遍,判断周边元素是不是相同即可:

bool ishacker(string str){
    for(int i = 0;i<str.length()-1;i++){
        if(str[i]==str[i+1]) return false;
    }
    return true;
}

整体代码实现:

#include<bits/stdc++.h>
using namespace std;
bool ishacker(string str){
    for(int i = 0;i<str.length()-1;i++){
        if(str[i]==str[i+1]) return false;
    }
    return true;
}
int main() 
{
    int t,n,m;
    string s1,s2;
    cin >> t;
    for(int i = 0;i<t;i++)
    {
        int n, m;
        cin >> n >> m>>s1>>s2;
        if (ishacker(s1))  
            cout << "YES" << endl;
        else
        {
            for (int i = 0; i < n - 1; i++)
            {
                if ((s1[i] == '0' && s1[i + 1] == '0' )|| (s1[i] == '1' && s1[i + 1] == '1'))
                {
                    s1.insert(i+1, s2);
                    n += m;
                    i += m;
                }
            }

            if (ishacker(s1)) 
                cout << "YES" << endl;
            else cout << "NO" << endl;
        }
    }
}

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值