CF716B Complete the Word 题解

CF716B Complete the Word 题解

分析

首先观察数据范围是 \(50000\),可以考虑 \(O(n)\) 暴力。

在字符串中枚举子串开始的位置 \(i\),然后再枚举 \(i\)\(i+25\),开个桶统计每个大写字母出现的次数,如果大于 \(1\) 就直接 break。统计完之后剩下的就都是问号了,可以随便填,所以这个子串是一定合法的。用 \(ans\) 来截取这一段合法子串,\(st\) 记录 \(ans\) 的起始位置,方便输出。如果所有子串都枚举完没有合法的,输出 \(-1\) 即可。

输出时没到子串 \(ans\) 时输出原串,问号随便输出。枚举到 \(st\) 时就输出 \(ans\),问号处缺啥填啥。

代码

代码过长,参考为主,不喜勿喷

#include <bits/stdc++.h>
using namespace std;
namespace Raiden
{
    int t[30];
    signed work()
    {
        string s, ans;
        int st;
        cin >> s;
        if (s.size() < 26)
            cout << -1 << endl, return 0;
        bool flag = 1;
        for (int i = 0; i <= s.size() - 26; i++)
        {
            flag = 1;
            memset(t, 0, sizeof(t));
            for (int j = i; j < i + 26; j++)
            {
                if (s[j] != '?')
                {
                    if (t[s[j] - 'A'] > 0)
                        flag = 0, break;
                    t[s[j] - 'A']++;
                }
            }
            if (flag)
            {
                ans = s.substr(i, 26);
                st = i;
                break;
            }
        }
        if (!flag)
            cout << -1 << endl, return 0;
        for (int i = 0; i < s.size(); i++)
        {
            if (i == st)
            {
                for (auto it : ans)
                {
                    if (it == '?')
                    {
                        for (int i = 0; i < 26; i++)
                            if (t[i] == 0)
                            {
                                cout << char(i + 'A');
                                t[i]++;
                                break;
                            }
                    }
                    else
                        cout << it;
                }
                i = st + 25;
            }
            else
            {
                if (s[i] == '?')
                    cout << 'A';
                else
                    cout << s[i];
            }
        }
        return 0;
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    return Raiden::work();
}
posted @ 2024-08-01 13:23  Ryan_Adam  阅读(9)  评论(0编辑  收藏  举报