列表

详情


NC54232. binary

描述

给定一个01串,定义表示逐位翻转(0变1,1变0)后并删去前导零后所得到的串。好的串定义如下:
是好的串
如果是好的串,则也是好的串
如果是好的串,则按顺序拼接)也是好的串
你需要判断串是否为好的
保证不含前导零

输入描述

第一行数据组数,对于每组数据:
第一行串,第二行串

输出描述

对于每组数据输出YES或者NO表示是否为好的

示例1

输入:

3
110
101
101
101000010100010111101000010
1100
101010

输出:

YES
YES
NO

说明:

对于第一组样例
rev("110") = "1"
"110" + "1" = "1101"
rev("1101") = "10"
"10" + "1" = "101"
上述提到的串均为好的串

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 412K, 提交时间: 2019-12-21 14:03:58

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
char s[N],t[N];
int dp[N];
int main()
{
    int _;cin>>_;while(_--)
    {
        scanf("%s%s",s+1,t+1);
        memset(dp,0,sizeof(dp));

        int n=strlen(s+1);
        int m=strlen(t+1);
        reverse(s+1,s+1+n);
        reverse(t+1,t+1+m);
        dp[0]=1;
        for(int i=0;i<m;++i){
            if(!dp[i]) continue;

            int k=t[i+1]^s[1];

            for(int j=1;j<=n;++j){
                if((s[j]^t[i+j])!=k) break;
                if(s[j]!=s[j+1]) dp[i+j]=1;
            }
        }
        if(dp[m]) puts("YES");
        else puts("NO");
    }
}

C++(clang++ 11.0.1) 解法, 执行用时: 2ms, 内存消耗: 420K, 提交时间: 2023-01-20 16:26:55

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

const int N = 1010;
char s[N],t[N];
int T,f[N];

int main() {
	cin >> T;
	while(T--) {
		scanf("%s",s+1);
		scanf("%s",t+1);
		int n=strlen(s+1),m=strlen(t+1);
		memset(f,0,sizeof f);
		reverse(s+1,s+n+1),reverse(t+1,t+m+1);
		f[0]=1;
		for(int i=0;i<m;i++) {
			if(!f[i]) continue;
			int k=t[i+1]^s[1];
			for(int j=1;j<=n&&i+j<=m;j++) {
				if((s[j] ^ t[i + j]) != k) break;
				if(s[j] != s[j + 1]) f[i + j] = 1;
			}
		}
		if(f[m]) cout << "YES" << endl;
        else cout <<  "NO" << endl;
	}
	return 0;
}

上一题