竞赛讨论区 > G原了?
头像
7_divided_by_3
发布于 12-17 00:03 山东
+ 关注

G原了?

CF2164D的弱化,将s和t都反转并取消每一步的输出。
code CF:

#include <bits/stdc++.h>
using namespace std; using ll = long long; int t_ = 1;
void solve()
{
    int n, m;
    cin >> n >> m;
    string ss, tt;
    cin >> ss >> tt;
    vector<int> pipei(n);
    vector<vector<int>> idx(26);
    vector<int> s(n), t(n);
    for (int i = 0; i < n; i++)
    {
        s[i] = ss[i] - 'a';
        t[i] = tt[i] - 'a';
    }
    for (int i = 0; i < n; i++)
        idx[s[i]].push_back(i);
    int R = n;
    for (int i = n - 1; i >= 0; i--)
    {
        auto it = ranges::upper_bound(idx[t[i]], min(R, i));
        if (it == idx[t[i]].begin())
        {
            cout << -1 << '\n';
            return;
        }
        it--;
        pipei[i] = *it;
        R = *it;
    }
    int maxk = 0;
    for (int i = 0; i < n; i++)
        maxk = max(maxk, abs(i - pipei[i]));
    if (maxk > m)
    {
        cout << -1 << '\n';
        return;
    }
    else
    {
        cout << maxk << '\n';
        string s2 = ss;
        for (int i = 0; i < maxk; i++)
        {
            for (int j = n - 1; j >= 1; j--)
            {
                if (pipei[j] < j)
                {
                    s2[j] = s2[j - 1];
                    pipei[j]++;
                }
            }
            cout << s2 << '\n';
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    cin >> t;
    for (t_ = 1; t_ <= t; t_ ++)
        solve();
    return 0;
}

code this

#include <bits/stdc++.h>
using namespace std; using ll = long long; int t_ = 1;
void solve()
{
    int n, m;
    cin >> n >> m;
    string ss, tt;
    cin >> ss >> tt;
    reverse(ss.begin(), ss.end());
    reverse(tt.begin(), tt.end());
    vector<int> pipei(n);
    vector<vector<int>> idx(26);
    vector<int> s(n), t(n);
    for (int i = 0; i < n; i++)
    {
        s[i] = ss[i] - 'a';
        t[i] = tt[i] - 'a';
    }
    for (int i = 0; i < n; i++)
        idx[s[i]].push_back(i);
    int R = n;
    for (int i = n - 1; i >= 0; i--)
    {
        auto it = ranges::upper_bound(idx[t[i]], min(R, i));
        if (it == idx[t[i]].begin())
        {
            cout << -1 << '\n';
            return;
        }
        it--;
        pipei[i] = *it;
        R = *it;
    }
    int maxk = 0;
    for (int i = 0; i < n; i++)
        maxk = max(maxk, abs(i - pipei[i]));
    if (maxk > m)
    {
        cout << -1 << '\n';
        return;
    }
    else
    {
        cout << maxk << '\n';
        /* string s2 = ss;
        for (int i = 0; i < maxk; i++)
        {
            for (int j = n - 1; j >= 1; j--)
            {
                if (pipei[j] < j)
                {
                    s2[j] = s2[j - 1];
                    pipei[j]++;
                }
            }
            cout << s2 << '\n';
        } */
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    // cin >> t;
    for (t_ = 1; t_ <= t; t_ ++)
        solve();
    return 0;
}

全部评论

(0) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐