【题意】
模拟一个文本编辑器
小写字母为输入 光标为插入模式时 在光标位置插入字符并且光标右移一位 为重写模式时 覆盖光标处字符并且光标右移一位,如果插入前光标就在最右边,则直接在右边插入新字符并且光标右移一位
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
*/