Codeforces Round #372 (Div. 2) B. Complete the Word __ two pointers、队列(queue)

ProLightsfx 2016-9-23 112 9/23
B. Complete the Word two pointers、队列(queue)

Source

Codeforces Round #372 (Div. 2)

 

My Solution

two pointers、队列(queue)

用 queue que;维护一个除了 '?'以外所有字符最多在该队列中出现一次的队列, 当que里的合法元素达到 26 个是就是 nice substring 了。

在这过程中 用 map<char, int> ch 维护队列中每个字符出现的次数, 且用 ind 维护队列的首元素的在s中的下标。

得到要求的que以后, 扫一遍map, 把没有出现过的大写字母丢到 队列 ans里去, 

然后 输出 s[ 0 ~ ind-1], 输出 nice substring,输出s[ind + 26 ~ sz -1]。

最开始的时候, 脑残的只输出了处理以后的 nice substring。Wrong answer on pretest 6

之后想了很久才发现 (┬_┬), 其中又有个小注意点, 即非nice substring 部分的 '?' 在输出的时候也要 用字母代替掉, 比如全用'A'。

复杂度 O(n)

 

#include 
#include 
#include 
#include 
#include 


using namespace std;
typedef long long LL;
const int maxn = 1e6 + 8;

map<char, int> ch;
queue que, ans;

int main()
{
    #ifdef LOCAL
    freopen("b.txt", "r", stdin);
    //freopen("o.txt", "w", stdout);
    int T = 6;
    while(T--){
    #endif // LOCAL
    ios::sync_with_stdio(false); cin.tie(0);

    string s;
    cin >> s;
    int sz = s.size();
    if(sz < 26) cout << -1 << endl;
    else{
        int ptr = 0, ind = 0;

        while(que.size() < 26){ que.push(s[ptr]); ch[s[ptr]]++; while(s[ptr] != '?' && ch[s[ptr]] > 1){
                ch[que.front()]--;
                que.pop();
                ind++;
            }
            ptr++;
            if(ptr >= sz) break;
        }
        if(que.size() == 26){
            for(int i = 0; i < 26 ; i++){
                if(ch[i + 'A'] == 0){
                    ans.push(i + 'A');
                }
            }

            for(int i = 0; i < ind; i++){
                if(s[i] != '?') cout << s[i];
                else cout << 'A';
            }
            while(!que.empty()){
                if(que.front() != '?'){
                    cout << que.front();
                }
                else{
                    cout << ans.front();
                    ans.pop();
                }
                que.pop();
            }
            for(int i = ind + 26; i < sz; i++){
                if(s[i] != '?') cout << s[i];
                else cout << 'A';
            }
            cout << endl;
        }
        else{ cout << -1 << endl;}
    }



    #ifdef LOCAL
    ch.clear();
    while(!que.empty()) que.pop();
    cout << endl;
    }
    #endif // LOCAL
    return 0;
}

 


非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

https://www.prolightsfxjh.com/

Thank you!

                                                                                                                                             ------from ProLightsfx

- THE END -

ProLightsfx

11月15日20:42

最后修改:2024年11月15日
0

非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

共有 0 条评论