• UVA11988-Broken Keyboard(数组模拟链表)


    Problem UVA11988-Broken Keyboard

    Accept: 5642  Submit: 34937

    Time Limit: 1000 mSec

    Problem Description

    You’re typing a long text with a broken keyboard. Well it’s not so badly broken. The only problem with the keyboard is that sometimes the “home” key or the “end” key gets automatically pressed (internally). You’re not aware of this issue, since you’re focusing on the text and did not even turn on the monitor! After you finished typing, you can see a text on the screen (if you turn on the monitor). In Chinese, we can call it Beiju. Your task is to find the Beiju text.

     Input

    There are several test cases. Each test case is a single line containing at least one and at most 100,000 letters, underscores and two special characters ‘[’ and ‘]’. ‘[’ means the “Home” key is pressed internally, and ‘]’ means the “End” key is pressed internally. The input is terminated by end-of-file (EOF).

     Output

    For each case, print the Beiju text on the screen.

     Sample Input

    This_is_a_[Beiju]_text [[]][][]

    Happy_Birthday_to_Tsinghua_University

    Sample output

    BeijuThis_is_a__text

    Happy_Birthday_to_Tsinghua_University

    题解:第一次做这个题完全是看着紫书的代码敲的,这一次才算是真的自己做出来,其实就是数组模拟链表,但是由于我的代码能力不好的,做起来不顺。

    首先是初始化的问题,Next数组全部是0,然后两个指针,一个now,一个tail前者用来表示当前应该在那个字符,后者表示已经处理过的字符串的真正的末尾。

    遇到文本字符,就用链表的方式插入到now的后面,然后now到这个新加入的字符,tail更新是看Next[now]是否为0,是0就赋值tail = now.

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 using namespace std;
     6 
     7 const int maxn = 100000+100;
     8 char str[maxn];
     9 int Next[maxn];
    10 
    11 int main()
    12 {
    13     //freopen("input.txt","r",stdin);
    14     while(~scanf("%s",str+1)){
    15         int len = strlen(str+1);
    16         int now = 0,tail = 0;
    17         memset(Next,0,sizeof(Next));
    18         for(int i = 1;i <= len;i++){
    19             if(str[i]!='[' && str[i]!=']'){
    20                 Next[i] = Next[now];
    21                 Next[now] = i;
    22                 now = i;
    23                 if(Next[now] == 0) tail = now;
    24             }
    25             else if(str[i] == '[') now = 0;
    26             else{
    27                 now = tail;
    28             }
    29         }
    30         int t = Next[0];
    31         while(t != 0){
    32             printf("%c",str[t]);
    33             t = Next[t];
    34         }
    35         printf("
    ");
    36     }
    37     return 0;
    38 }
  • 相关阅读:
    查询表结构信息 封装为存储过程了
    小代码大BUG,记解决Sqlite3死锁问题
    DICT协议浅解
    重载"=="和"!="运算符
    Path.Combine(string,string)
    [原创]SQL SERVER 2008 函数大全 字符串函数
    Could not find a Direct3D device that has a Direct3D9level driver and supports pixel shader 1.1 or greater.终极解决方法
    (转)SqlServer Management Objects简介,生成建表等SQL语句
    界面设计之颜色搭配
    献给初学者,[winform]中如何设计高效全局的快捷键?[ShortcutKeys]
  • 原文地址:https://www.cnblogs.com/npugen/p/9501320.html
Copyright © 2020-2023  润新知