码迷,mamicode.com
首页 > 其他好文 > 详细

2015 ACM/ICPC Asia Regional Beijing Online

时间:2015-09-21 12:11:17      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:

The Cats‘ Feeding Spots

 

Mission Impossible 6

模拟题。想法是用结构体数组做一个链表。

比赛的时候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

 

Protecting Homeless Cats

 

The Celebration of Rabbits

 

Border Length

 

Couple Trees

 

Boxes

 

Fractal

 

New Teaching Buildings

 

Scores

 

2015 ACM/ICPC Asia Regional Beijing Online

标签:

原文地址:http://www.cnblogs.com/Aguin/p/4825531.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!