2015 ACM/ICPC Asia Regional Beijing Online

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

时间: 2024-10-08 08:47:32

2015 ACM/ICPC Asia Regional Beijing Online的相关文章

(并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )

http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2061    Accepted Submission(s): 711 Problem Description Jack likes to travel around the wo

2015 ACM/ICPC Asia Regional Changchun Online HDU 5444 Elven Postman【二叉排序树的建树和遍历查找】

Elven Postman Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 591    Accepted Submission(s): 329 Problem Description Elves are very peculiar creatures. As we all know, they can live for a very

【题解】 2015 ACM/ICPC Asia Regional Shenyang Online

[1006] FangFang (暴力枚举) Fang Fang Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 871    Accepted Submission(s): 364 Problem Description Fang Fang says she wants to be remembered. I promise her.

【二分】【最长上升子序列】HDU 5489 Removed Interval (2015 ACM/ICPC Asia Regional Hefei Online)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5489 题目大意: 一个N(N<=100000)个数的序列,要从中去掉相邻的L个数(去掉整个区间),使得剩余的数最长上升子序列(LIS)最长. 题目思路: [二分][最长上升子序列] 首先,假设去掉[i,i+m-1]这L个数,剩余的LIS长度为max(i左端最后一个不大于a[i+m]的LIS长度+a[i+m]开始到最后的LIS长度). 所以,我们从n到1逆向先求最长下降子序列的长度f[i],就可以知

【线段树】HDU 5493 Queue (2015 ACM/ICPC Asia Regional Hefei Online)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5493 题目大意: N个人,每个人有一个唯一的高度h,还有一个排名r,表示它前面或后面比它高的人的个数,求按身高字典序最小同时满足排名的身高排列. 题目思路: [线段树] 首先可以知道,一个人前面或后面有r个人比他高,那么他是第r+1高或第n-i-r+1高,i为这个人是第几高的. 所以先将人按照身高从小到大排序,接下来,把当前这个人放在第k=min(r+1,n-i-r+1)高的位置. 用线段树维护包

【动态规划】HDU 5492 Find a path (2015 ACM/ICPC Asia Regional Hefei Online)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5492 题目大意: 一个N*M的矩阵,一个人从(1,1)走到(N,M),每次只能向下或向右走.求(N+M-1)ΣN+M-1(Ai-Aavg)2最小.Aavg为平均值. (N,M<=30,矩阵里的元素0<=C<=30) 题目思路: [动态规划] 首先化简式子,得原式=(N+M-1)ΣN+M-1(Ai2)-(ΣN+M-1Ai)2 f[i][j][k]表示走到A[i][j]格子上,此时前i+j-1

HDU 5491 The Next 构造(2015 ACM/ICPC Asia Regional Hefei Online)

[链接]click here~~ [题意]: 给你一个D(0≤D<231),保证D的二进制中1的数量在s1和s2之间 然后让你求一个最小的数,使得这个数的二进制数量大于等于s1,小于等于s2,且大于 d [思路]虽然是比赛时候的一道水题,但是开始看到的时候并没有想到好的思路,最后还是学弟强行过掉,今天突然想到了可以用lowbit来求 首先看到D的范围是很大的,那么如何 构造呢? 这里举个例子:比如11,二进制表示(1011),取11+1=12,二进制表示(1100)s1=2,那么我们要做的就是考

(字符串处理)Fang Fang -- hdu -- 5455 (2015 ACM/ICPC Asia Regional Shenyang Online)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=5455 Fang Fang Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 233    Accepted Submission(s): 110 Problem Description Fang Fang says she wants to be

(线段树 区间查询)The Water Problem -- hdu -- 5443 (2015 ACM/ICPC Asia Regional Changchun Online)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=5443 The Water Problem Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 738    Accepted Submission(s): 591 Problem Description In Land waterless, w