- #include
- using namespace std;
- using PII = pair<int,int >;
- using ll = long long;
- using VI = vector<int>;
- using namespace std;
- int n;
- void solve(){
- string s;
- cin>>s;
- bool ok = true;
- int num = 0;
- VI a{1};
- //1表示排序好的,0表示无序,-1表示不确定
- for(auto x : s){
- if(x == '+') {
- num ++;
- int cur = a.back();
- //如果队尾元素是 1 ,那么加入一个新元素可以有序,可以无序
- //如果是 0 ,那么加入后依旧无序
- if(cur == 1 && num >= 2) cur = -1;
-
- a.push_back(cur);
-
- }else if(x == '-'){
- num --;
- int cur = a.back();
- a.pop_back();
- if(cur == 1) a.back() = 1;
- // 如果pop出的元素是排序好的,那么就带表前面所有的元素都是排序好的
- //就把这个状态更新到前一个点
-
- }else if(x == '1'){
-
- if(a.back() == 0){
- //表示无序,直接错误
- ok = false;
- break;
- }else if(a.back() == -1){
- //待定的可以修改为 1 有序
- a.back() = 1;
- }
- }else if(x == '0'){
- //同上
- if(a.back() == -1){
- a.back() = 0;
- }else if(a.back() == 1){
- ok = false;
- break;
- }
- }
-
- }
- if(ok){
- cout<<"YES\n";
- }else{
- cout<<"NO\n";
- }
-
- }
- int main(){
- int t;
- cin>>t;
- while (t--){
- solve();
- }
-
-
- }
还是学习别人写的
用1 0 -1模拟
表示这个位置是连续 ,不练,还是待定
删除和添加的时候。看最后一个数的状态,然后更新新的尾部