[FZYZOJ 1339] 修改密码

P1339 -- 修改密码

时间限制:1000MS

内存限制:131072KB

Description

柯南知道小兰破解了他设置的密码,所以他决定把密码改掉。为了防止再次被破解,他定义了一系列命令用来修改并检验自己的密码:

1、Insert C:表示在光标后插入C这个字符,光标在插入的字符前;

2、Delete:表示删除光标后的字符(保证光标不在密码尾端);

3、Next:表示将光标向后移一个字符(保证光标不在密码尾端);

4、Prev:表示将光标向前移一个字符(保证光标不在密码首端)。

5、Print N:表示输出密码第N位,输出的字符占一行(Print命令少于10个)。

柯南会先给出一个初始密码,光标在第一个字符前。他希望你编一个程序来实现这些命令,并给出修改后的最终密码。

Input Format

第一行为一个字符串,表示初始密码。

接下来每行一个命令,命令格式如题目描述所示。

输入保证任意时刻密码的长度不会超过1000000。

Output Format

对于每个Print命令,输出一个字符,每个字符占一行。

最后一行输出最终密码。

Sample Input

Mdeify
Print 3
Next
Next
Delete
Print 3
Prev
Insert o
Print 3

Sample Output

e
i
d
Modify

【题解】本题明显链表题目,开2倍的数组即可,用来练练手。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char pwd[2000100];
 4 int len;
 5 int next[2000100],prev[2000100],cs=1;
 6 int main() {
 7     scanf("%s",pwd+1);
 8     len=strlen(pwd+1);
 9     //for (int i=len;i>=1;--i) pwd[i]=pwd[i-1];
10     for (int i=1;i<=len;++i) {
11         prev[i]=i-1;
12         next[i-1]=i;
13     }
14     len++;
15     char opt[1000];
16     while(~scanf("%s",opt)) {
17         if (opt[2]=='i') {
18             int x,a=1,b=0;
19             scanf("%d",&x);
20             while(a<=x) {
21                 b=next[b];
22                 a++;
23             }
24             printf("%c\n",pwd[b]);
25         }
26         if(opt[0]=='N') cs=next[cs];
27         if(opt[3]=='v') cs=prev[cs];
28         if(opt[0]=='D') {
29             next[prev[cs]]=next[cs];
30             prev[next[cs]]=prev[cs];
31             cs=next[cs];
32         }
33         if(opt[0]=='I') {
34             char k;
35             scanf(" %c",&k);
36             pwd[len]=k;
37             prev[len]=prev[cs];
38             next[len]=cs;
39             next[prev[cs]]=len;
40             prev[cs]=len;
41             cs=len;
42             len++;
43         }
44     }
45     for (int i=0;next[i];i=next[i]) printf("%c",pwd[next[i]]);
46     return 0;    
47 }
View Code

 

posted @ 2015-06-04 17:30  TonyFang  阅读(284)  评论(0编辑  收藏  举报