[gym102267L]ABC

time limit per test : 1.0 s
memory limit per test : 256 MB

You are given a string consisting of letters ′ a ′ , ′ b ′ 'a', 'b' a,b and ′ c ′ 'c' c, and there are 4 4 4 kinds of operations you can do on it:

Replace a character ′ a ′ 'a' a in the string with " a b " "ab" "ab".
Replace a character ′ b ′ 'b' b in the string with " b c " "bc" "bc".
Replace a character ′ c ′ 'c' c in the string with " b a " "ba" "ba".
Remove a substring(consecutive characters) " a b c " "abc" "abc" from the string.

Let n n n be the length of the string, can you remove the whole string using at most 3 n 3n 3n operations or state that it’s impossible to do so?
Input

The first and only line contains the string s ( 1 ≤ n ≤ 2 × 1 0 5 ) s(1≤n≤2×10^5) s(1n2×105) consisting of characters ′ a ′ , ′ b ′ 'a', 'b' a,b and ′ c ′ 'c' c.
Output

If it’s impossible to remove the whole string print − 1 -1 1, otherwise in the first line print m ( 1 ≤ m ≤ 3 n ) m(1≤m≤3n) m(1m3n), the number of operations you will make.

In each of the next m m m lines print an operation of the form t y p e i , i n d e x i ( 1 ≤ t y p e i ≤ 4 , 1 ≤ i n d e x i ≤ ∣ s ∣ ) type_i,index_i(1≤type_i≤4,1≤index_i≤|s|) typei,indexi(1typei4,1indexis), the type of the ith operation and the index of the character you want to do the ith operation on, if the operation is of type 4 4 4, then indexi should be the index of the first character of the substring “abc” that you want to remove. Indexi is 1 1 1−based and the string is updated after each operation, see example notes for better understanding.
Examples
Input

acab

Output

4
1 1
4 1
2 2
4 1

Input

bac

Output

-1

Note

This is how the string changes in the first example: a c a b → a b c a b → a b → a b c → ϕ acab→abcab→ab→abc→ϕ acababcabababcϕ, where ϕ ϕ ϕ is the empty string.

题意:
给定一个字符串,只含 ′ a ′ , ′ b ′ , ′ c ′ 'a','b','c' a,b,c三种字符
你有四种操作
1.将一个’a’,变成"ab"
2.将一个’b’,变成"bc"
3.将一个’c’,变成"ba"
4.删除一个"abc"子串
设字符串长度为n,则你的操作数不能超过3*n
输出如何操作才能将给定的字符串变为空串
格式为 t y p e i    i n d e x i type_i \ \ index_i typei  indexi分别表示第i次操作的操作类型和操作位置。
如果不能则输出-1

题解:
考虑用栈来维护当前字符串。

首先我们考虑删去 c c c
考虑结尾的情况
对于ac来说,我们可以 a c → a b a → a b c a → a ac→aba→abca→a acabaabcaa
读于bbc来说,我们可以 b b c → b c b c → b b a b c → b b bbc→bcbc→bbabc→bb bbcbcbcbbabcbb
对于abc来说,我们直接删掉abc
对于bc来说,我们无法删去c,直接-1

然后处理完所有的c
我们得到了一个ab串
然后对于每个b来说只要找一个a对应即可。

最后对于只剩a的情况,直接删掉即可, a → a b → a b c → ϕ a→ab→abc→ϕ aababcϕ

#include<bits/stdc++.h>
#define ll long long
#define pa pair<int,int>
using namespace std;
char s[200004];
char st[200004],st2[200004];
vector<pa>ans;
int l,t,t2;
int main(){
    scanf("%s",s+1);
    l=strlen(s+1);
    t=0;
    if(s[1]!='a'){
        return puts("-1"),0;
    }
    for(int i=1;i<=l;i++){
        if(s[i]=='c'){
            if(t>1){
                if(st[t-1]=='a'&&st[t]=='b'){
                    ans.push_back({4,t-1});
                    t-=2;
                    continue;
                }
                if(st[t]=='a'){
                    ans.push_back({3,t+1});
                    ans.push_back({2,t+1});
                    ans.push_back({4,t});
                    continue;
                }
                if(st[t-1]=='b'&&st[t]=='b'){
                    ans.push_back({2,t-1});
                    ans.push_back({3,t});
                    ans.push_back({4,t+1});
                    continue;
                }
                return puts("-1"),0;
            }
            else if(t==0){
                return puts("-1"),0;
            }
            else if(t==1){
                if(st[t]=='b'){
                    return puts("-1"),0;
                }
                else{
                    ans.push_back({3,t+1});
                    ans.push_back({2,t+1});
                    ans.push_back({4,t});
                    continue;
                }
            }
        }
        else{
            st[++t]=s[i];
        }
    }
    //for(int i=1;i<=t;i++)cout<<st[i];cout<<endl;
    t2=0;
    for(int i=1;i<=t;i++){
        if(st[i]=='b'){
            if(t2==0){
                return puts("-1"),0;
            }
            else{
                ans.push_back({2,t2+1});
                ans.push_back({4,t2});
                t2--;
            }
        }
        else{
            st2[++t2]=st[i];
        }
    }
    for(int i=1;i<=t2;i++){
        ans.push_back({1,1});
        ans.push_back({2,2});
        ans.push_back({4,1});
    }
    if(ans.size()>l*3)return puts("-1"),0;
    printf("%d\n",ans.size());
    for(int i=0;i<ans.size();i++)printf("%d %d\n",ans[i].first,ans[i].second);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值