zoukankan      html  css  js  c++  java
  • [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
    ",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
    这篇文章由TonyFang发布。 所有解释权归TonyFang所有。 Mailto: tony-fang@map-le.net
  • 相关阅读:
    堆排序
    剑指 Offer 59
    面试题:happen-before原则和as-if-serial语义
    面试题:Redis的持久化机制是什么?各自的优缺点?
    面试题:单线程redis还这么快
    面试题:微服务理论
    wait和notify
    线程八锁
    面试题:在静态方法和非静态方法上加 Synchronized的区别
    面试题:3种线程阻塞唤醒的对比
  • 原文地址:https://www.cnblogs.com/TonyNeal/p/fzyzoj1339.html
Copyright © 2011-2022 走看看