模拟题。想法是用结构体数组做一个链表。
比赛的时候WA了。说一下几个注意点。
1.光标到头的时候不能再动了。
2.字符总数不能超过M,如果V操作溢出则不执行V操作(而不是粘贴部分)。
3.复制的时候有左右方向。
4.复制状态下进行了除L/R/D以外的操作则停止复制。注意!!此时不更新剪贴板。
5.每次操作之后记得更新光标的位置。
6.每个Case初始化各种变量时,串与剪贴板清空。
反思:比赛的时候思路不是很清晰,代码没有模块化。用IDE调也不熟练。(或许该换一个了
这是赛后重写的版本。
1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 using namespace std; 5 const int maxn=11111; 6 char op[maxn],cpy[maxn],buff[maxn]; 7 // 操作 剪贴板 缓存区 8 int M,len_op,cnt_str,F,L,pos,cp1; 9 // 长度限制 操作长度 字符池大小 光标前字符数 当前总字符数 光标位置 复制起始位置 10 int cnt_buff,dir_cpy; 11 // 缓存区字符数 复制方向 12 bool ins,on; 13 // 输入模式 复制开关 14 15 struct node//链表保存字符 记录前后节点下标 16 { 17 char c; 18 int l,r; 19 } str[2*maxn]; 20 21 void Init(void) 22 { 23 memset(str,0,sizeof(str)); 24 memset(cpy,0,sizeof(cpy)); 25 scanf("%d%s",&M,op); 26 len_op=strlen(op),cnt_str=F=L=pos=0; 27 cnt_buff=dir_cpy=0; 28 ins=1,on=0; 29 return; 30 } 31 32 void Move(int type)//复制时光标移动更新选中区域 33 { 34 if(type*dir_cpy>=0) 35 { 36 buff[cnt_buff++]=str[pos].c; 37 dir_cpy=type; 38 } 39 else 40 { 41 buff[cnt_buff--]=0; 42 if(cnt_buff==0) dir_cpy=0; 43 } 44 return; 45 } 46 47 void Delete(int ll,int rr)//链表删除一段字符 48 { 49 str[ll].r=str[rr].r; 50 if(str[rr].r) str[str[rr].r].l=ll; 51 pos=ll; 52 return; 53 } 54 55 void get_buff(void)//从缓存区更新剪贴板 56 { 57 if(dir_cpy>0) for(int i=0;i<cnt_buff;i++) 58 cpy[i]=buff[i]; 59 if(dir_cpy<0) for(int i=0;i<cnt_buff;i++) 60 cpy[i]=buff[cnt_buff-i-1]; 61 cpy[cnt_buff]=0; 62 return; 63 } 64 65 void Insert(char* s,int tmp)//光标位置插入tmp个字符 66 { 67 L+=tmp; F+=tmp; 68 for(int i=0;i<tmp;i++) 69 { 70 str[++cnt_str].c=s[i]; 71 if(str[pos].r) 72 { 73 str[cnt_str].r=str[pos].r; 74 str[str[pos].r].l=cnt_str; 75 } 76 str[pos].r=cnt_str; 77 str[cnt_str].l=pos; 78 pos=cnt_str; 79 } 80 return; 81 } 82 83 void Overwrite(char* s,int tmp)//光标位置改写tmp个字符 84 { 85 F+=tmp; 86 for(int i=0;i<tmp;i++) 87 { 88 if(str[pos].r) 89 { 90 pos=str[pos].r; 91 str[pos].c=s[i]; 92 } 93 else 94 { 95 L++; 96 str[++cnt_str].c=s[i]; 97 str[pos].r=cnt_str; 98 str[cnt_str].l=pos; 99 pos=cnt_str; 100 } 101 } 102 return; 103 } 104 105 void Solve(void) 106 { 107 for(int i=0;i<len_op;i++) 108 { 109 if(op[i]==‘L‘) 110 { 111 if(pos) 112 { 113 F--; 114 if(on) Move(-1); 115 pos=str[pos].l; 116 } 117 } 118 else if(op[i]==‘R‘) 119 { 120 if(str[pos].r) 121 { 122 F++; 123 pos=str[pos].r; 124 if(on) Move(1); 125 } 126 } 127 else if(op[i]==‘S‘) {ins=!ins;on=0;} 128 else if(op[i]==‘D‘) 129 { 130 if(on&&cnt_buff) 131 { 132 if(dir_cpy>0) Delete(cp1,pos),F-=cnt_buff; 133 else Delete(pos,cp1); 134 L-=cnt_buff; on=0; 135 } 136 else if(!on&&str[pos].r) Delete(pos,str[pos].r),L--; 137 } 138 else if(op[i]==‘B‘) 139 { 140 if(pos) Delete(str[pos].l,pos),L--,F--; 141 on=0; 142 } 143 else if(op[i]==‘C‘) 144 { 145 if(!on) 146 { 147 on=1; cp1=pos; 148 cnt_buff=dir_cpy=0; 149 } 150 else get_buff(),on=0; 151 } 152 else if(op[i]==‘V‘) 153 { 154 int tmp=strlen(cpy); 155 if(ins&&tmp+L<=M) Insert(cpy,tmp); 156 else if(!ins&&F+tmp<=M) Overwrite(cpy,tmp); 157 on=0; 158 } 159 else 160 { 161 if(ins&&L<M) Insert(op+i,1); 162 if(!ins&&F<M) Overwrite(op+i,1); 163 on=0; 164 } 165 } 166 return; 167 } 168 169 void ans_print(void) 170 { 171 if(!L) puts("NOTHING"); 172 else 173 { 174 int p=str[0].r; 175 while(p) 176 { 177 printf("%c",str[p].c); 178 p=str[p].r; 179 } 180 puts(""); 181 } 182 return; 183 } 184 185 int main(void) 186 { 187 int T; cin>>T; 188 while(T--) 189 { 190 Init(); 191 Solve(); 192 ans_print(); 193 } 194 return 0; 195 }
Aguin
G Boxes
H Fractal
J Scores
时间: 2024-10-08 08:47:32