hihocoder1228 && 2015亚洲区域赛北京赛区B – Mission Impossible 6(恶心的模拟)

hihocoder1228

【题意】

模拟一个文本编辑器

小写字母为输入 光标为插入模式时 在光标位置插入字符并且光标右移一位 为重写模式时 覆盖光标处字符并且光标右移一位,如果插入前光标就在最右边,则直接在右边插入新字符并且光标右移一位

L 光标左移 R光标右移 S为转换光标模式

D删除光标右边字母 B删除左边字母

C为复制 初始为关 按一下变开 再按一下转换为关 同时把选择区内的字符串存取剪切板(如果粘贴板之前有东西 替换掉

C为开时 如果出现L R D外的字母 立即转换为关 不产生任何作用 LR正常执行 D变为删除选取内的字符串

V为粘贴 如果光标为插入 把剪切板内容插入到当前光标位置 如果光标为覆盖模式 假设剪切板有k个字母 当前光标往后k个字母被替换掉 不足k个 也被k个替换 粘贴完成后光标移动到粘贴上的字符串的最右端

此外有字符数量限制m 任何导致超过m的操作将被取消 特别的 对于V 如果导致超过m 不会粘贴上任何东西

【分析】超级恶心,注意题意,各种调试就好了。如果数据特意卡的话可以用repo来写(自己手撸平衡树当然也可以,估计要调试到疯掉)

【AC CODE】6ms

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define rep(i,a,n) for(int i = a; i < n; i++)
#define repe(i,a,n) for(int i = a; i <= n; i++)
#define per(i,n,a) for(int i = n; i >= a; i--)
#define clc(a,b) memset(a,b,sizeof(a))
const int INF = 0x3f3f3f3f, MAXN = 10000+10;
char a[MAXN],txt[MAXN],buf[MAXN];
int m,p,len,isi,kc,st,buflen;

inline void insert(char c)
{
	if(isi)
	{
		if(len == m) return;
		per(i,len,p+1) txt[i] = txt[i-1];
		len++;
		txt[p++] = c;
	}
	else
	{
		//if(p == len) return;
		txt[p++] = c;
		if(p > len) len = p;
	}
}
void del(int pos)
{
	if(pos < 0 || pos >= len) return;
	rep(i,pos,len-1) txt[i] = txt[i+1];
	len--;
	if(pos < p) p--;
}
void into_buf(int x, int y)
{
	buflen = 0;
	if(x == y) return;
	if(x > y) swap(x,y);
	rep(i,x,y) buf[buflen++] = txt[i];
}
void del_str(int x, int y)
{
	if(x == y) return;
	if(x > y) swap(x,y);
	int n = y-x;
	rep(i,x,len-n)
		txt[i] = txt[i+n];
	len -= n;
	if(y < p) p -= n;
	if(p > len) p = len;
}
char tmp[MAXN];
void insert_buf()
{
	if(isi)
	{
		if(len + buflen > m) return;
		txt[len] = 0;
		strcpy(tmp,txt+p);
		txt[p] = 0;
		buf[buflen] = 0;
		strcat(txt,buf);
		strcat(txt,tmp);
		len += buflen;
		p += buflen;
	}
	else
	{
		if(buflen+p > m) return;
		rep(i,0,buflen)
		{
			txt[p+i] = buf[i];
		}
		if(buflen+p > len)
		{
			len = buflen+p;
			p = len;
		}
		else p += buflen;
	}
}
int main()
{
#ifdef SHY
	freopen("d:\\1.txt", "r", stdin);
#endif
	int t;
	scanf("%d", &t);
	while(t--)
	{
		scanf("%d %s", &m, a);
		if(0 == m)
		{
			puts("NOTHING");
			continue;
		}
		isi = true;
		kc = false;
		txt[0] = len = buflen = buf[0] = p = 0;
		st = -1;
		int n = strlen(a);
		rep(i,0,n)
		{
			if(islower(a[i]))
			{
				kc  = 0;
				insert(a[i]);
			}
			else
			{
				if('L' == a[i])
				{
					if(p > 0) p--;
				}
				else if('R' == a[i])
				{
					if(p < len) p++;
				}
				else if('S' == a[i])
				{
					kc  = 0;
					isi ^= 1;
				}
				else if('D' == a[i])
				{
					if(kc)
					{
						del_str(st,p);
						kc = 0;
					}
					else del(p);
				}
				else if('B' == a[i])
				{
					kc  = 0;
					del(p-1);
				}
				else if('C' == a[i])
				{
					kc ^= 1;
					if(kc)
					{
						st = p;
					}
					else
					{
						into_buf(st,p);
					}
				}
				else if('V' == a[i])
				{
					kc  = 0;
					insert_buf();
				}
			}
		}
		if(len)
		{
			txt[len] = 0;
			puts(txt);
		}
		else puts("NOTHING");
	}
	return 0;
}
/*
9
50 abLSLLDabc
25 abcdefgLLLSxyzSLLku
50 abcdeLSCLLDLLRRabc
15 abcBBdeLLDDxzDDDDRRRR
10 abcdLLBB
100 abcdeLCLLD
5 abcLkjff
30 abcdeCLLCRRVCLRCabVkz
10 abcBBBLB
*/

 

发表评论

邮箱地址不会被公开。 必填项已用*标注

请输入正确的验证码