• Codeforces Round #657 (Div. 2) A. Acacius and String(字符串)


    题目链接:https://codeforces.com/contest/1379/problem/A

    题意

    给出一个由 '?' 和小写字母组成的字符串,可以将 '?' 替换为小写字母,判断是否存在一种替换方案使得字符串只包含一个 'abacaba' 子串。

    题解

    首先计算原字符串中所求子串的个数:

    • 如果个数多于一,则不存在满足要求的替换方案
    • 如果个数等于一,将所有 '?' 替换为 'abc‘ 外的字母即可
    • 如果个数少于一,判断是否有可以替换的子串,以及替换后是否只有一个子串,如 'abaca?acaba' 替换后有两个子串

    代码

    #include <bits/stdc++.h>
    using namespace std;
    const string str = "abacaba";
    
    bool can_replace(string s) {
        for (int i = 0; i < str.size(); ++i) 
            if (s[i] != str[i] and s[i] != '?')
                return false;
        return true;
    }
    
    int count_str(string s) {
        int res = 0;
        for (int i = 0; i + str.size() - 1 < s.size(); ++i)
            if (s.substr(i, str.size()) == str)
                ++res;
        return res;
    }
    
    void solve() {
        int n; string s; cin >> n >> s;
        int cnt = count_str(s);
        if (cnt > 1) {
            cout << "No" << "
    ";
        } else if (cnt == 1) {
            cas:;
            for (char &c : s)
                if (c == '?') c = 'z';
            cout << "Yes" << "
    " << s << "
    ";
        } else {
            for (int i = 0; i + str.size() - 1 < s.size(); ++i) {
                string t = s.substr(i, str.size());
                if (can_replace(t)) {
                    s.replace(i, str.size(), str);
                    if (count_str(s) == 1) goto cas;
                    s.replace(i, str.size(), t);
                }
            }
            cout << "No" << "
    ";
        }    
    }
    
    int main() {
        int t; cin >> t;
        while (t--) solve();
    }
  • 相关阅读:
    10.6比赛 T1
    10.5比赛 T3
    10.5比赛 T2
    10.5比赛 T1
    最大子序列问题
    Python编程快速上手_第 4 章 列表
    Python编程快速上手_第 3 章 函数
    Python编程快速上手_第 2 章 控制流
    Python编程快速上手_第 1 章 Python基础
    Python 编程快速上手 ——让繁琐工作自动化
  • 原文地址:https://www.cnblogs.com/Kanoon/p/13345655.html
Copyright © 2020-2023  润新知