1 条题解

  • 0
    @ 2023-1-29 11:33:18

    CF1671A.String Building

    题目大意

    题目描述

    给出一个只有字母 aabb 的字符串 ss ,问能否用多个字符串aa,aaa,bb,bbb组成这个字符串。

    输入格式

    给出一个数 tt,表示有 tt 组测试用例。

    接下来 tt 行,每行一个字符串 ss

    输出格式

    一共 tt 行,每行都是YES或者NO表示能否组成这个字符串。

    题目分析

    由题意可得,将 ss 分为 kk 块。如果第 ii 块有奇数个字符,并且字符数量多于 11 那么就再分,分为 2n(nN)2n(n\in\mathbb N) 块。多出来的一个字符可以给第 nn 块,这样就会有 2(n1)2(n-1) 个字符串aabb11 个字符串aaabbb。如果第 ii 块有偶数个字符,那么就有 2n(nN)2n(n\in\mathbb N)aabb

    但是无论如何第 ii 块都必须有多于 11 个字符。如果有一块只有一个字符,那么它这个字符必定和前后不一样。所以我们只需要从 s1s_1 开始查找,判断这个字符和它前后的字符是否相同。

    注意要判断 s0s_0 是否等于 s1s_1,否则如果出现如abb这样的数据就会给出错误结果,还有s.size()是否等于 00,否则会Runtime Error

    时间复杂度 O(n)\mathcal O(n),注意有 O(2)\mathcal O(2) 的处理。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    void solve () {
    	string s;
    	cin >> s;
    	
    	if (s.size () == 1) {
    			cout << "NO" << endl;
    			return;
    	} 
    	
    	if (s [0] != s [1]) {
    		cout << "NO" << endl;
    		return;
    	}
    	
    	for (int i = 1; i < s.size (); i ++) {
    		if (s [i] != s [i - 1] && s [i] != s [i + 1]){
    			cout << "NO" << endl;
    			return;
    		} 
    	}
    	
    	cout << "YES" << endl;
    }
    
    int main () {
    	int t;
    	cin >> t;
    	
    	while (t --) {
    		solve();
    	}
    	
    	return 0;
    }
    
    • 1

    信息

    ID
    7820
    时间
    2000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者