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