问题: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.

输入:

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).

输出:

For each case, print the Beiju text on the screen

示例输入

This_is_a_[Beiju]_text

[[]][][]Happy_Birthday_to_Tsinghua_University

示例输出

BeijuThis_is_a__text

Happy_Birthday_to_Tsinghua_University

题意:假如你在打字,home键和end键不定时就会被按下,用[代表home,用]代表end,最终打出来的结果是什么?

(home键功能:光标跳到行开始.end:光标跳到行末尾)

思路:

1.最简单的想法是用链表做,用一个指针记录当前输入光标,每读一个字母就加一个节点. 但是代码比较复杂,懒得敲,

另解2.

用字符串做.

假设 [ 是1, ] 是2,

定义一个变量mod存放这个状态,刚开始默认mod=2

把字符一个个的读到c数组.

如果再读到[ 或 ],就判断mod,

if(mod==2){
strcat (b,c);
更改mod为新状态;
memset将c置零;
} if(mod=1){
strcat(c,b);
strcpy(b,c);
更改mod为新状态;
memset将c置零;
}

 记得最后再多一步这个,把最后那段也放到b里.最后输出b即可.

另解3.确定字符串里哪部分先输出后输出

观察到输出时是最后面的 [后面的内容先输出,直到再遇到括号.其次是前一个[后面的内容,以此类推...等所有左括号的全输出完了,再把剩下的输出.

算法:

把字符串存到数组里:

先找到[字符的位置,存到b数组里,并把 [ 和] 都置0.注意,不要把]也存到b里.

然后根据b的索引,依次输出a[6]串,a[3]串,同时输出完就写0销毁,:

最后把剩下的输出即可,用putchar一个个的输出.

代码:

#include<stdio.h>
#include<string.h>
int main()
{
int b[100002];//存放 [ 的位置
char a[100002];//存放字符串
int k,i,lena;
while(gets(a)){//gets遇到EOF就返回0
k=1;
lena=strlen(a);
for(i=0;i<lena;i++){
if(a[i]=='['||a[i]==']'){
if(a[i]=='[') b[k++]=i; //把第K个 [ 的位置序号放到b[k]
a[i]='\0';//把[ ]位置写0
}
}
k--;//消去多加的那个 while(k){ //从最右边的 [ 开始,依次输出
printf("%s",a+b[k]+1);
memset(a+b[k]+1,0,strlen(a+b[k]+1));//输出完就写0销毁,防止下次重复输出
k--;
} for(i=0;i<lena;i++){//把剩下没有前置的字符全输出
if(a[i]!='\0') putchar(a[i]);
} putchar(10);//换行
}
return 0;
}

我用的第三种方法,注意memset的使用,以及循环的控制即可.

Broken Keyboard (a.k.a. Beiju Text) 思路的更多相关文章

  1. B - Broken Keyboard (a.k.a. Beiju Text)

    Problem B Broken Keyboard (a.k.a. Beiju Text) You're typing a long text with a broken keyboard. Well ...

  2. uva - Broken Keyboard (a.k.a. Beiju Text)(链表)

    11988 - Broken Keyboard (a.k.a. Beiju Text) You’re typing a long text with a broken keyboard. Well i ...

  3. 破损的键盘(悲剧文本)(Broken Keyboard(a.k.a. Beiju Text),Uva 11988)

    破损的键盘(悲剧文本)(Broken Keyboard(a.k.a. Beiju Text),Uva 11988) 题意描述 你在输入文章的时候,键盘上的Home键和End键出了问题,会不定时的按下. ...

  4. N - Broken Keyboard (a.k.a. Beiju Text)(DFS,链表)

    N - Broken Keyboard (a.k.a. Beiju Text) Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:% ...

  5. UVA——11988 Broken Keyboard (a.k.a. Beiju Text)

    11988 Broken Keyboard (a.k.a. Beiju Text)You’re typing a long text with a broken keyboard. Well it’s ...

  6. UVA 11988 Broken Keyboard (a.k.a. Beiju Text)(链表)

    题目代号:UVA 11988 题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&pa ...

  7. B - Broken Keyboard (a.k.a. Beiju Text) 数组模拟链表

    You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem wi ...

  8. UVa 11988 Broken Keyboard (a.k.a. Beiju Text)(链表)

    You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem wi ...

  9. Broken Keyboard (a.k.a. Beiju Text) UVA - 11988

    You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem wi ...

随机推荐

  1. read 命令详解

    read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量 语法选项 -p read –p “提示语句”,则屏幕就会输出提示语句,等待输入,并将输入存储在REPLY中 -n ...

  2. [转载]C#堆栈讲解

    1:栈就是堆栈,因为堆和堆栈这样说太拗口了,搞得像绕口令,所以有些时候就把堆栈简称为栈.堆和栈,你看这又多舒服.但无论什么时候,堆栈都不等于堆和栈,必须说,堆和栈或者堆和堆栈. 2:值类型变量和引用类 ...

  3. .NET 常用ORM之Nbear

    NBear是一个基于.Net 2.0.C#2.0开放全部源代码的的软件开发框架类库.NBear的设计目标是尽最大努力减少开发人员的工作量,最大程度提升开发效率,同时兼顾性能及可伸缩性. 一.新建项目并 ...

  4. linux学习---ps、kill

    一.ps       查看进程 ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的:如果想对进程时间监控,应该用 top 工具 linux上进程有5种状态: 1. 运行(正在运行或 ...

  5. Centos7 安装 apache + php7.0 环境

    安装apache rpm -qa|grep httpd   查看是否安装 yum install httpd  安装 service httpd start  启动服务 测试是否 启动       I ...

  6. 学写网页 #06# table

    A B E C D <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> & ...

  7. apache的rewrite机制配置

    步骤: 1:启用rewrite模块,在默认情况下,没有启用 修改httpd.conf文件 #启动rewrite模块 LoadModule rewrite_module modules/mod_rewr ...

  8. linux 安装sqlite3

    python2个版本导致的问题. 网上找了好多方法都不行. 最后自己莫名其妙弄好了, 回想了一下大概是 安装sqlite3 重新安装python 最后 yum update 更新 就好了.

  9. php stomp.dll 下载地址

    http://pecl.php.net/package/stomp/1.0.9/windows 查看方法,打开phpinfo

  10. centos误删mysql root用户找回办法

    一天,我进入mysql后,查看所有用户 select host,user from mysql.user; 发现好多用户名, 太乱了,删除..... delete from user where us ...