zoukankan      html  css  js  c++  java
  • Broken Keyboard(悲剧文本)

    你有一个键盘,键盘上所有的键都能正常使用,只是Home键和End键有时会自动按下。你并不知道这一情况,而是专心地打稿子,甚至连显示器都没开电源。当你打开显示器之后,展现在你面前的是一段悲剧文本。你的任务是根据给出的键盘上实际输入的内容,计算并输出这段悲剧文本(即显示器上展现的文本)

    Input:

    一行文本不超过1000000个字符,只包括字母、下划线、字符'['(表示Home键)和字符']'(表示End键盘)。

    Output:

    一个字符串,即符合题目描述的悲剧文本。

    Example:

    Input:

    This_is_a_[Beijing]_tex

    Output:

    BeijingThis_is_a__text

    ___________________________________________________________________________________________________________

    问题分析:

    该问题最简单的想法是利用数组来保存这些数据,然后用一个变量来保存光标位置,输入一个字符相当于在数组中插入一个字符,但是没插入一个字符将要移动大量的数据,程序的开销会很大。

    为了解决这个问题,我们可以利用静态链表解决这个问题

    先用一个字符串将每个字符储存起来,s[1-n],对每个s[i]都会对应一个next[i]游标,储存的是下一个结点的下标,同时利用一个curr,表示光标位置,并用last记录最后元素位置,s[0]是一个虚拟字符,用作头结点。

    #include<iostream>
    #include<string>
    using namespace std;
    
    const int size=100000+1;
    
    int last;       //显示屏上的最后一个字符
    int cur;       //光标位置,总在当前s[i]的左方
    char s[size];             //用以储存string
    
    int main()
    {
    	int next[size]={0};           //每个s[i]的游标,初始化为0
    	while(scanf("%s",s+1)==1)
    	{
    		//初始化
    		int n=strlen(s+1); //真正的字符从s[1]开始,s[0]是一个虚拟字符
    		last=0;                 
    	    cur=0;
    	    
    		//重排next
    		for(int i=1;i<=n;i++)
    		{
    			if(s[i]=='[')
    				cur=0;      //home键
                else if(s[i]==']')
                    cur=last;				//end键
         	    else
    			{
    				next[i]=next[cur];
    				next[cur]=i;
    			    if(cur==last)last=i;   //当从string的最后插入时,last要+1
    				cur=i;
    			}
    		}
    	
    	    //输出
    		for(int j=next[0];j!=0;j=next[j])  //依据next中指定的顺序输出
    			cout<<s[j];
    		cout<<endl;
    	}
    	
    	return 0;
    }
    

      

  • 相关阅读:
    Git:五、操作远程仓库
    Git:四、连接GitHub远程仓库
    Git:三、工作原理
    Git:二、本地文件操作
    Git:一、简介&安装Git 2.20.1——Mac&Win
    Web前端:博客美化:四、网易云音乐单曲播放器
    设计模式之代理模式(proxy pattern)
    OpenCC的编译与多语言使用
    唯一标识符漫谈
    vscode local attach 和 remote debug
  • 原文地址:https://www.cnblogs.com/KennyRom/p/5896073.html
Copyright © 2011-2022 走看看