等价串--解题报告

牛客小白月赛4 --F 等价串--解题报告


题目描述 
一串长度为 n 的字符串 A 和一串长度为 m 的字符串 B。并且这两串字符串只会含有 0 或 1 。
铁子可以对字符串 A 执行两种操作,两种操作可以执行任意次。
操作1(无情替换):铁子可以用 11 替换掉 0 ,也可以用 00 替换掉 1 .
操作2(极限删除):铁子可以删除掉 111 ,也可以删除 000 .
现在问,字符串 A 可以变成字符串 B 吗?


输入描述:
第一行有一个整数T,表示有T(1<=T<=1000)组测试数据。
接下来的每组数据,第一行有两个整数n,m(1<=n,m<=100),表示字符串A和字符串B的长度。
接下来有两行字符串,分别表示字符串A和字符串B。

输出描述:
对于每组测试数据,如果字符串A可以变为字符串B,则输出一行”YES”,否则输出一行”NO”.输出不包括引号。
示例1
输入


3
3 4
010
1110
3 4
010
1111
7 2
0001000
00




输出
YES
NO
YES
说明对于第一个样例,铁子可以对字符串A使用一次无情替换可以变成1110


解题思路:很明显这是一个有关字符串的题目(也就是对string的灵活运用)
这里牵涉的string的知识点有:
字符串的查找---------find()
字符串的替换---------replace()
字符串的删除----------erase()
题目中的两个操作其实可以看成是两种操作:
1.以用 11 替换掉 0,后在可以删除掉 111 ,也可以删除 000 
2.用 00 替换掉 1,后在可以删除掉 111 ,也可以删除 000
这里不难发现如果对A,B字符串进行这两种操作,那么就会产生16种相对应的操作(4*4)
这里可以简化问题将A,B中的字符串中的0都替换成1,然后在删除111,然后比较A,B是否相等
从而可以得出A是否可以转化为B


下面附上我的代码:


#include<bits/stdc++.h>
using namespace std;


int main()
{
    int t,n,m;
    string a,b;
    cin >> t;
    while(t--)
    {
        cin >> n >> m;
        cin >> a >> b;
        int p;
        while((p = a.find('0'))!=string::npos) a.replace(p,1,"11");
        while((p = a.find("111"))!=string::npos) a.erase(p,3);
        while((p = b.find('0'))!=string::npos) b.replace(p,1,"11");
        while((p = b.find("111"))!=string::npos) b.erase(p,3);
        if(a==b)
        {
            cout << "YES\n";
        }
        else
        {
            cout << "NO\n";
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41682681/article/details/80717770
今日推荐