2015 网赛 北京 - B Mission Impossible 6 模拟

来源:互联网 发布:帝国时代2mac版 编辑:程序博客网 时间:2024/04/29 05:43

纯模拟。。赛前恰好看到神奇的rope!上去直接就用了,不过后来听说没有超时的问题sting都可以过。。

#include <bits/stdc++.h>#include <ext/rope>using namespace std;using namespace __gnu_cxx;int m;char s[10010];struct Line{    rope<char> str;    int mode; // 0:insert 1:overwrite    int now;    int copyStatus; // 0: nothing 1 :start    int cp1; // copy postion1    string clip;    void init(){        str.clear();        copyStatus = mode = now = 0;        clip = "";    }    void add(char c){        int len = str.size();        if(mode == 0){            if(len == m) return;            str.insert(now,c);            now++;        }else{            if(len == m && now == len) return;            str.replace(now,c);            now++;        }    }    void left(){        if(now>0) now--;    }    void right(){        if(now<str.size()) now++;    }    void change(){        if(copyStatus == 1) copyStatus = 0;        mode = !mode;    }    void delD(){        if(copyStatus == 1){            int t1 = min(now,cp1), t2 = max(now,cp1);            str.erase(t1,t2-t1);            copyStatus = 0;            now = t1;        }        else if(now < str.size()){            str.erase(now,1);        }        //output();        //cout << copyStatus <<endl;    }    void delB(){        //output();        if(copyStatus == 1) copyStatus = 0;        if(now > 0 ){            //cout << str[now-1] << endl;            str.erase(now-1,1);            //output();            now--;        }    }    void copy(){        if(copyStatus == 0){            copyStatus = 1;            cp1 = now;        }else{            copyStatus = 0;            if(now == cp1) clip = "";            else{                int t1 = min(now,cp1), t2 = max(now,cp1);                clip = "";                for(int i=t1;i<t2;i++){                    clip += str[i];                }            }        }    }    void paste(){        //output();        if(clip=="") return;//        for (int i = 0; i < clip.size(); i++) {//            cout << clip[i] << endl;//        }//        cout << "!" << endl;//        cout << clip << " " << clip.size() << endl;        int len = clip.size();       //cout <<"len: " << str.size() <<" " <<  len << endl;        if(mode == 0){            if(str.size() + len > m) return;            //cout <<"@@copy:";            for(int i=0;i<len;i++){                str.insert(now++,clip[i]);                //cout << clip[i] ;            }            //cout << endl;        }else{            if(now + len > m) return;            //cout << "xxx" << endl;            for(int i=0;i<len;i++){                str.replace(now++,clip[i]);            }        }    }    void output(){        int len = str.size();        if(len ==0 ) puts("NOTHING");        else{            for(int i=0;i<len;i++){                printf("%c",str[i]);            }            printf("\n");        }    }};void solve(){    int len = strlen(s);    Line res;    res.init();    for(int i=0;i<len;i++){        if(s[i] >= 'a' && s[i]<='z') {            if(res.copyStatus == 1) res.copyStatus = 0;            res.add(s[i]);        }        else if(s[i] == 'L') res.left();        else if(s[i] == 'R') res.right();        else if(s[i] == 'S') res.change();        else if(s[i] == 'D') res.delD();        else if(s[i] == 'B') res.delB();        else if(s[i] == 'C') res.copy();        else if(s[i] == 'V') res.paste();    }    res.output();}int main(){    int T;    scanf("%d",&T);    while(T--){        scanf("%d",&m);        scanf("%s",s);        solve();    }    return 0;}


0 0
原创粉丝点击