hihocoder 1228 Mission Impossible 6(2015北京网赛 B)

Mission Impossible 6

        大模拟一个。。反正这种题比赛的时候都是最后写的,读题一定要仔细,代码逻辑要清晰,最好带注释,我很幸运地在最后10min1A了。。

        感觉要特别注意的地方是状态的修改,还有光标的移动,不能超过长度限制等等。最繁琐的地方应该是复制粘贴,把题目每个要求都满足应该就差不多了,其实样例给得已经够良心了。

        另外有个意外收获,就是有人怕O(n)的字符串操作TLE,用了rope这个库,有空学习一下!

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <complex>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <sstream>
#include <utility>
#include <iostream>
#include <algorithm>
#include <functional>
#define LL long long
#define INF 0x7fffffff
using namespace std;

string str;

string clipboard;

const int INSERT=0;
const int OVERWRITE=1;

const int NOTHING=0;
const int START=1;

char ans[20010];

int gb;			//光标位置
int lineend;	// 
int mode;
int pos1;		//复制开始的位置 
int copymode;

void init(){
	gb=0;
	lineend=0; 
	mode=INSERT;
	pos1=-1;
	copymode=NOTHING;
	clipboard="";
}


void output(){
	if(lineend>0){
		ans[lineend]='\0';
		/*for(int i=0;i<lineend;i++){
			printf("%c",ans[i]);
		}*/
		printf("%s\n",ans);
	}else{
		printf("NOTHING\n");
	}
}

int main() {
	int t;
	cin>>t;
	while(t--) {
		init();
		int M;
		cin>>M>>str;
		int len = str.size();
		
		for(int q=0;q<len;q++){
			char op = str[q];
			if(op=='L'){
				if(gb>0)gb--;
			}else if(op=='R'){
				if(gb<lineend&&gb<M-1)gb++;
				
			}else if(op=='S'){
				mode=!mode;
				copymode=NOTHING;
			}else if(op=='D'){
				if(copymode==START){	//复制的东西就没了。。 
					copymode=NOTHING;
					int s=gb,t=pos1;
					if(s>t){
						swap(s,t);
					}
					int dist=t-s;
					for(int i=t;i<lineend;i++){
						ans[i-dist]=ans[i];
					}
					lineend-=dist;
					gb=s;
				}else{
					if(gb<lineend){
						for(int i=gb;i<lineend;i++){
							ans[i]=ans[i+1];
						}
						lineend--;
					}
				}
			}else if(op=='B'){
				copymode=NOTHING;
				if(gb>0){
					for(int i=gb;i<lineend;i++){
						ans[i-1]=ans[i];
					}
					lineend--;
					gb--;
				}
			}else if(op=='C'){
				if(copymode==NOTHING){
					pos1=gb;
				}else{
					int s=gb,t=pos1;
					if(s>t){
						swap(s,t);
					}
					clipboard="";
					for(int i=s;i<t;i++){
						clipboard+=ans[i];
					}
				}
				copymode=!copymode;
			}else if(op=='V'){
				copymode=NOTHING;
				int cliplen=clipboard.size();
				if(mode==INSERT){
					if(cliplen+lineend<=M){	//不能超长 
						for(int i=lineend-1;i>=gb;i--){
							ans[i+cliplen]=ans[i];
						}
						for(int i=0;i<cliplen;i++){
							ans[i+gb]=clipboard[i];
						}
						lineend+=cliplen;
						gb+=cliplen;
					}
				}else{
					if(cliplen+gb<=M){	//不能超长 
						for(int i=0;i<cliplen;i++){
							ans[i+gb]=clipboard[i];
						}
						gb+=cliplen;
						lineend=max(lineend,gb);
					}
				}
			}else{
				copymode=NOTHING;
				if(mode==INSERT){	//插入 
					if(lineend<M){	//没有超过长度 
						for(int i=lineend;i>gb;i--){
							ans[i]=ans[i-1];
						}
						ans[gb]=op;
						lineend++;
						gb++;
					}else{
						
					}
				}else{	//覆盖 
					ans[gb]=op;
					gb++;
					if(gb>M){
						gb--;
					}
					lineend=max(lineend,gb);
				}
			}
			//output();
		}
		output();
	}
	return 0;
}

你可能感兴趣的:(2015ICPC,北京网赛)