Mission Impossible 6

题目:Mission Impossible 6

题目链接:http://hihocoder.com/problemset/problem/1228

题目大意:

   大概就是让我们写一个代码模拟文本编辑器的部分功能,要求实现下面的操作功能:

   1. 小写字母就是输入

   2. L 表示光标左移,R 表示右移,如果超过了当前字符串的范围就忽略

   3. S 表示在插入和覆盖之间的转换,如果在插入状态,就在光标右边插入一个字符,如果是覆盖状态,就覆盖右边的一个字符。

   4. D 表示删除光标右边的一个字符

   5. B 表示删除光标左边的一个字符

   6. C 表示在复制状态和普通状态之间的转换,在进入复制状态的时候,当时光标所在的位置作为位置1,结束复制状态的时候光标所在的位置为位置2,那么这两个坐标之间的字符将被复制,结束复制条件:出现小写字符、出现除了L、R外的大写字符,特别的,如果在复制状态中出现D,那么将删除选中区域的所有字符,这并没有完成复制(以前的复制在转换为复制状态的时候就清空了)。结束复制的字符仍然发挥他本身的作用。

   7. V 表示粘贴,如果粘贴后的结果超过字符数目限制,则操作无效,这一条同样适用于上面任何一种操作。

   8. 具体可以再看下英文。。。

题目思路:

   模拟题思路一般都很简单,经过几次惨痛的教训,我总结到: 比赛的时候遇到模拟题不要着急入手,一定要想清楚解题的方法和数据结构,不然你会发现越做越难,到最后不得不放弃,同时可以考虑模块化,先从简单的开始,比如这道题的字符数量限制,先不做考虑,等写出全部代码,再加上这一条便会很简单(代码风格很差的例外...)。

   通常,模拟题不需要考虑时间复杂度和空间复杂度,只要不太过分,可以随便开,不要畏首畏尾,这也是教训。

   这道题,因为经常进行删除和插入操作,我采用的是链表结构,这样代码写起来会容易很多。其他的也没什么了,很水的一道题。

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4
  5 #define abs(x) (x<0?-x:x)
  6
  7 typedef struct stri
  8 {
  9   char c;
 10   int length;
 11   struct stri *pos;
 12   bool add_method;
 13   struct stri *next;
 14   struct stri *last;
 15 }Str;
 16
 17 bool cop;
 18 Str *l,*r;
 19 int co=0;
 20 char st[10010];
 21 int lst;
 22
 23 void completeCopy(Str *str)
 24 {
 25   lst=0;
 26   cop=0;
 27   if(co==0) st[0]=0;
 28   else if(co>0)
 29   {
 30     l=l->next;
 31     while(l!=r)
 32     {
 33       st[lst++]=l->c;
 34       l=l->next;
 35     }
 36     st[lst++]=l->c;
 37     st[lst]=0;
 38   }
 39   else
 40   {
 41     r=r->next;
 42     while(r!=l)
 43     {
 44       st[lst++]=r->c;
 45       r=r->next;
 46     }
 47     st[lst++]=r->c;
 48     st[lst]=0;
 49   }
 50 }
 51
 52 int Maxlen;
 53
 54 Str *Init()
 55 {
 56   Str *str;
 57   str=(Str *)malloc(sizeof(Str));
 58   str->c=‘@‘;
 59   str->pos=str;
 60   str->add_method=0;
 61   str->length=0;
 62   str->next=NULL;
 63   str->last=NULL;
 64   return str;
 65 }
 66
 67 void Add(Str *str,char c)
 68 {
 69   if(str->add_method==0)
 70   {
 71     if(str->length>=Maxlen) return ;
 72     Str *s;
 73     s=(Str *)malloc(sizeof(Str));
 74     s->c=c;
 75     s->last=str->pos;
 76     s->next=str->pos->next;
 77     if(str->pos->next)
 78       str->pos->next->last=s;
 79     str->pos->next=s;
 80     str->pos=s;
 81     str->length++;
 82   }
 83   else
 84   {
 85     if(str->pos->next==NULL)
 86     {
 87       if(str->length>=Maxlen) return ;
 88       Str *s;
 89       s=(Str *)malloc(sizeof(Str));
 90       s->c=c;
 91       s->last=str->pos;
 92       s->next=str->pos->next;
 93       if(str->pos->next)
 94         str->pos->next->last=s;
 95       str->pos->next=s;
 96       str->pos=s;
 97       str->length++;
 98     }
 99     else
100     {
101       str->pos->next->c=c;
102       str->pos=str->pos->next;
103     }
104   }
105 }
106
107 void Delete(Str *str)
108 {
109   if(cop==1)
110   {
111     cop=0;
112     if(co<0)
113     {
114       Str *p=r->next;
115       str->pos->next=l->next;
116       if(l->next)
117         l->next->last=str->pos;
118       Str *tmp=l->next;
119       while(p!=tmp)
120       {
121         Str *q=p;
122         p=p->next;
123         free(q);
124       }
125     }
126     else if(co==0);
127     else
128     {
129       str->pos=l;
130       Str *p=l->next;
131       l->next=r->next;
132       if(r->next)
133         r->next->last=l;
134       Str *tmp=r->next;
135       while(p!=tmp)
136       {
137         Str *q=p;
138         p=p->next;
139         free(q);
140       }
141     }
142     str->length-=(co<0)?-co:co;
143     return ;
144   }
145   if(str->pos->next==NULL);
146   else
147   {
148     Str *p=str->pos->next;
149     str->pos->next=str->pos->next->next;
150     if(str->pos->next)
151       str->pos->next->last=str->pos;
152     free(p);
153     str->length--;
154   }
155 }
156
157 void Belete(Str *str)
158 {
159   if(str->pos->c==‘@‘);
160   else
161   {
162     Str *p=str->pos;
163     str->pos=str->pos->last;
164     str->pos->next=str->pos->next->next;
165     if(str->pos->next)
166       str->pos->next->last=str->pos;
167     free(p);
168     str->length--;
169   }
170 }
171
172 void Display(Str *str)
173 {
174   Str *p=str->next;
175   while(p)
176   {
177     printf("%c",p->c);
178     p=p->next;
179   }
180   printf("\n");
181 }
182
183 void Paste(Str *str)
184 {
185   if(str->add_method==0)
186   {
187     if(str->length+abs(co)>Maxlen) return ;
188   }
189   else
190   {
191     int lo=0;
192     Str *p=str->pos;
193     while(p->next)
194     {
195       lo++;
196       p=p->next;
197     }
198     if(str->length+abs(co)-lo>Maxlen) return ;
199   }
200   for(int i=0;st[i];i++)
201   {
202     Add(str,st[i]);
203   }
204 }
205
206 void Clear(Str *str)
207 {
208   Str *p=str;
209   while(p)
210   {
211     Str *q=p;
212     p=p->next;
213     free(q);
214   }
215 }
216
217 int main()
218 {
219   int t;
220   scanf("%d",&t);
221   while(t--)
222   {
223     cop=0;
224     scanf("%d",&Maxlen);
225     char s[10000];
226     scanf("%s",s);
227     Str *str=Init();
228     for(int i=0;s[i];i++)
229     {
230       if(s[i]>=‘a‘&&s[i]<=‘z‘)
231       {
232         if(cop==1)
233         {
234           completeCopy(str);
235         }
236         Add(str,s[i]);
237       }
238       else if(s[i]==‘R‘)
239       {
240         if(str->pos->next==NULL) co--;
241         else str->pos=str->pos->next;
242         if(cop==1)
243         {
244           r=str->pos;
245           co++;
246         }
247       }
248       else if(s[i]==‘L‘)
249       {
250         if(str->pos->c==‘@‘) co++;
251         else str->pos=str->pos->last;
252         if(cop==1)
253         {
254           r=str->pos;
255           co--;
256         }
257       }
258       else if(s[i]==‘S‘)
259       {
260         str->add_method^=1;
261         if(cop==1)
262         {
263           completeCopy(str);
264         }
265       }
266       else if(s[i]==‘D‘)
267       {
268         Delete(str);
269       }
270       else if(s[i]==‘B‘)
271       {
272         if(cop==1)
273         {
274           completeCopy(str);
275         }
276         Belete(str);
277       }
278       else if(s[i]==‘C‘)
279       {
280         cop^=1;
281         if(cop==1)
282         {
283           l=str->pos;
284           r=l;
285           lst=0;
286           st[0]=0;
287           co=0;
288         }
289         else
290         {
291           completeCopy(str);
292         }
293       }
294       else if(s[i]==‘V‘)
295       {
296         Paste(str);
297         if(cop==1)
298         {
299           completeCopy(str);
300         }
301       }
302     }
303     if(str->next==NULL) printf("NOTHING");
304     Display(str);
305     Clear(str);
306   }
307   return 0;
308 }
时间: 2024-10-14 13:11:15

Mission Impossible 6的相关文章

2015 ACM-ICPC国际大学生程序设计竞赛北京赛区网络赛 1002 Mission Impossible 6

题目链接: #1228 : Mission Impossible 6 解题思路: 认真读题,细心模拟,注意细节,就没有什么咯!写这个题解就是想记录一下rope的用法,以后忘记方便复习. rope(块状链表)属于SGI STL的一部分,不属于ISO C++标准库,但libstdc++-v3也包含了扩展,在头文件#include<ext/rope>,using namespace __gnu_cxx命名空间中.可以在很短的时间内实现快速的插入.删除和查找字符串. rope.size()    返回

ACM-ICPC国际大学生程序设计竞赛北京赛区(2015)网络赛 B Mission Impossible 6

#1228 : Mission Impossible 6 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 You must have seen the very famous movie series,"Mission Impossible", from 1 to 4. And "Mission Impossible 5" is now on screen in China. Tom Cruise is just learning pro

hdu 3272 Mission Impossible

Mission Impossible Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 414    Accepted Submission(s): 178 Problem Description There are A, B, C, D four kinds of resources, A can be obtained at any p

HDU 3272 - Mission Impossible(计算几何)

HDU 3272 - Mission Impossible(计算几何) ACM 题目地址: HDU 3272 - Mission Impossible 题意: 在二维平面上,给你一个初始位置(hx,hy),你需要获得四种资源,A在x轴上任意位置,B在y轴上任意位置,C.D位置会告诉你.问获得四种资源后返回(hx,hy)最短要走多长. 分析: 三条线段与X.Y轴相交有三种情况: 与x,y都相交,此时最短距离为周长 仅与X或Y相交,这时枚举每条边,利用镜像对称算出距离,取最小值 与X和Y都不相交,这

hiho Mission Impossible 6(模拟 未提交验证。。)

题意:模拟文本操作 思路:模拟 #include<iostream> #include<stdio.h> #include<string.h> using namespace std; #define MAXN 10005 int M; char cmd[MAXN]; char str1[MAXN],str2[MAXN]; char copyStr[MAXN]; void f(){ int i,j,k,len,len1,len2,lencp; len=strlen(cm

hihocoder 1228 Mission Impossible 6

题意:一个模拟……大概就是模拟一个编辑文档的过程……具体的还是读题吧…… 解法:刚开场就发现的一个模拟……果断敲起来…… 要注意几点与实际编辑过程不同: 1.当用C操作标记一段字符后,只有D会改变这段字符,其他操作例如V或输入字符都不会改变这段字符,只会取消标记状态,在当前光标位置进行操作. 2.在替换模式下,V操作会进行替换粘贴,与传统编辑模式不同. 3.如果输入操作或者V操作进行后就会超过文档长度,那么就不进行操作. 大概就这些吧……模拟的过程和按题里说的写就没问题……C的处理麻烦一些,但是

[HDU4316]Mission Impossible(计算几何/凸包/半平面交)

题目链接: HDU4316 计算几何太duliu了~ 题目大意:空间中有一个物体,上空有\(3\)个摄像头拍摄地面,求摄像头公共盲区面积大小 首先求出每一个摄像头的盲区: 将物体的每一个点投影到地面再求凸包即可. 然后将\(3\)个凸包的每一条边都拿来一起做一次半平面交,求出公共盲区 最后三角剖分求面积就好了. 代码: #include <cmath> #include <cstdio> #include <vector> #include <algorithm&

FJUT2017寒假训练二题解

A题 题意:让你找出唯一的一个四位数,满足对话时的要求. 思路:因为是4位数,可以直接从1000-9999遍历一遍,判断是否有唯一的数能满足所有条件,如果不是唯一的或者没有满足条件的数就输出Not sure.特别丑的代码附上... 1 #include<stdio.h> 2 int a[10000],b[10000],c[10000]; 3 int main() 4 { 5 int n; 6 while(~scanf("%d",&n)) 7 { 8 if(n==0)

领域建模

领域建模的真相 我们一提及领域建模,就好像回到了石器时代.然而这个谜题至今还未解决,就好像穴居人的生存方式,我们只能猜测.推测以及演绎,却不能真实复现. Martin Fowler的<分析模式>总结了诸多领域分析模式,Eric Evans开创了领域驱动设计的办法,至于还要老的CRC方法,用例驱动,ICONIX方法以及稍新一些的四色建模法,都在尝试领域模型的建构,结果仍然差强人意. 这个问题或许是Mission Impossible,因为领域逻辑其实是一个复杂系统,系统中的模型如三体一般互相影响