[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 }
这篇文章由TonyFang发布。
所有解释权归TonyFang所有。
Mailto: tony-fang@map-le.net