zoukankan      html  css  js  c++  java
  • UVa11988 Broken Keyboard(练习链表使用)

       向量和数组的优势是可以随机的存取元素和在末尾添加删除元素,而当插入元素时,需要移动大量的数据,消耗大量的时间。而链表的优势是可以在O(1)删除和插入数据。所以在频繁移动元素时,可以使用链表。

        分析:如果用一个数组来保存,题目中的文本随着光标位置的移动需不断的插入字符,这样会导致大量字符移动问题。解决方案是采用链表,将字符串保存在buf[1...n]中,然后用next[i]表示下标为i的字符的下一个位置的下标(链表不一定用指针实现)。为了方便起见,用一个虚拟的next[0]指向显示屏最右边的字符下标。再用cur表示光标的位置,即为光标在buf[cur]的右边.cur==0说明光标在显示屏的最左边。还用last表示显示屏最右边的字符。

    #define _CRT_SECURE_NO_DEPRECATE
    #include <iostream>
    #include<string.h>
    #include <algorithm>
    using namespace std;
    const int maxn = 100000 + 5;
    
    char buf[maxn];
    int Next[maxn];
    
    int main(){
    	int cur, last,n;
    	while (scanf("%s", buf+1)!=EOF){
    		n = strlen(buf + 1);
    		cur = last = 0;
    		for (int i = 1; i <= n; i++){
    			if (buf[i] == '[')cur = 0;    //house键
    			else if (buf[i] == ']')cur = last; //end键
    			else{
    				Next[i] = Next[cur];   //字符i的下一个位置为cur的下一个位置
    				Next[cur] = i;         //curr的下一个位置为i
    				//更新cur和last
    				if (cur == last)last = i;   //cur等于i表示光标在显示屏最后一个字符
    				cur = i;  //移动光标
    			}
    		}
    		Next[last] = 0;  //结束位置
    		for (int i = Next[0]; i != 0; i = Next[i])
    			printf("%c", buf[i]);
    		printf("
    ");
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    自动化运维工具Ansible
    svn服务
    关于nagios系统下使用shell脚本自定义监控插件的编写以及没有实时监控图的问题
    企业级监控nagios实践
    centos6 下FastDFS 在storage节点上nginx的fastdfs-nginx-module 模块编译出现的问题
    分布式文件系统FastDFS
    运维的各个阶段
    用php做一个简单的注册用户功能
    ttttttttttt
    exclude和include当中/**和/*区别
  • 原文地址:https://www.cnblogs.com/td15980891505/p/5915814.html
Copyright © 2011-2022 走看看