输入样例1:
jilin[i lofe{{-v-} ] universiti=y
输出样例1:
i love jilin university
输入样例2:
abcd[c-de
输出样例2:
cdecd
输入样例3:
[[]][][]happy=birthday
输出样例3:
happbirthday
输入样例4:
efg[bbb}}=}}}}=[{{{{a
输出样例4:
abbbe
思路:
这也是一道模拟题,初次看可能会犹豫该不该使用vector容器来模拟操作,毕竟50000个字符操作量还是很大的。不妨试一试?毕竟要实现一个双端队列还是挺麻烦的事情。
参考代码:
#include<bits/stdc++.h>
using namespace std;
class InputSystem {
private:
vector<char> chain; // 字符串链表,用数组模拟
bool isInsert; // 是否是插入状态
int index;
public:
InputSystem() {
isInsert = false;
index = 0;
}
void moveToHome() {
index = 0;
}
void moveToEnd() {
index = chain.size();
}
void moveLeft() {
if(index - 1 >= 0) {
index--;
}
}
void moveRight() {
if(index + 1 <= chain.size()) {
index++;
}
}
void changeInsertstate() {
isInsert = !isInsert;
}
void backspace() {
if(chain.size() > 0) {
chain.erase(chain.begin() + index - 1);
index--;
}
}
void input(char ch) {
if(index == chain.size()-1) {
chain.push_back(ch);
} else if(isInsert) {
chain[index] = ch;
} else {
chain.insert(chain.begin() + index, ch);
}
index++;
}
string toString() {
string res;
for(const char& ch: chain) res.push_back(ch);
return res;
}
void operator>>(const char& ch) {
if(ch == '[') {
moveToHome();
} else if(ch == ']') {
moveToEnd();
} else if(ch == '{') {
moveLeft();
} else if(ch == '}') {
moveRight();
} else if(ch == '-') {
changeInsertstate();
} else if(ch == '=') {
backspace();
} else {
input(ch);
}
}
};
int main() {
string line; getline(cin, line);
InputSystem in;
for(const char& ch:line) in>>ch;
cout<<in.toString()<<endl;
return 0;
}