https://codeforces.com/problemset/problem/1335/B

题目分析

维护一个长度为子串长度的队列,其中不重复的字母数为要求的数目。 在每次迭代中取出队头到字符串ans尾部,并且维护队列中的不重复的字母数。

代码实现

#include <iostream>
#include <cstring>
#include <queue>
#include <bitset>
using namespace std;

void solve() {
    int n, a, b, cnt = 0;
    int st[26];
    memset(st,0,sizeof st);
    bitset <26> ca;
    queue <int> que;
    cin >> n >> a >> b;
    for (int i = 0; i < b; ++i) ca[i] = 1;
    int p = 0;
    while (que.size() != a) {
        if (ca[p]) {
            que.push(p);
            ++st[p++];
        }
        else p = 0;
    }
    while (cnt != n) {
        int t = que.front(); que.pop();
        cout << (char)(t + 'a');
        ++cnt;
        --st[t];
        if (!st[t]) {
            que.push(t);
            ++st[t];
        }
        else que.push(0); 
    }
    cout << '\n';
}
int t;
int main () {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> t;
    while(t--) solve();
    return 0;
}
分类: StringThought

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用*标注

友情链接:Ctips' blog, Colza’s blog

站点状态:Status