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 444 kinds of operations you can do on it:
Replace a character ′a′'a'′a′ in the string with "ab""ab""ab".
Replace a character ′b′'b'′b′ in the string with "bc""bc""bc".
Replace a character ′c′'c'′c′ in the string with "ba""ba""ba".
Remove a substring(consecutive characters) "abc""abc""abc" from the string.
Let nnn be the length of the string, can you remove the whole string using at most 3n3n3n operations or state that it’s impossible to do so?
Input
The first and only line contains the string s(1≤n≤2×105)s(1≤n≤2×10^5)s(1≤n≤2×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≤3n)m(1≤m≤3n)m(1≤m≤3n), the number of operations you will make.
In each of the next mmm lines print an operation of the form typei,indexi(1≤typei≤4,1≤indexi≤∣s∣)type_i,index_i(1≤type_i≤4,1≤index_i≤|s|)typei,indexi(1≤typei≤4,1≤indexi≤∣s∣), 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 444, then indexi should be the index of the first character of the substring “abc” that you want to remove. Indexi is 111−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: acab→abcab→ab→abc→ϕacab→abcab→ab→abc→ϕacab→abcab→ab→abc→ϕ, 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
输出如何操作才能将给定的字符串变为空串
格式为typei indexitype_i \ \ index_itypei indexi分别表示第i次操作的操作类型和操作位置。
如果不能则输出-1
题解:
考虑用栈来维护当前字符串。
首先我们考虑删去ccc
考虑结尾的情况
对于ac来说,我们可以ac→aba→abca→aac→aba→abca→aac→aba→abca→a
读于bbc来说,我们可以bbc→bcbc→bbabc→bbbbc→bcbc→bbabc→bbbbc→bcbc→bbabc→bb
对于abc来说,我们直接删掉abc
对于bc来说,我们无法删去c,直接-1
然后处理完所有的c
我们得到了一个ab串
然后对于每个b来说只要找一个a对应即可。
最后对于只剩a的情况,直接删掉即可, a→ab→abc→ϕa→ab→abc→ϕa→ab→abc→ϕ
#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;
}