uva 11988 这题可以看出c++中string效率的底下

用c语言实现

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

typedef struct node
{
    char x;
    struct node *next;
}chan;

chan *root = new chan;
char a[100010];

int main()
{

    while(scanf("%s" , a) != EOF)
    {
        int i ;
        root->next = NULL;
        int n = strlen(a);
        chan *r = root , *q = root;
        for(i = 0; i < n; i++)
		{
			if(a[i] == ‘[‘)
			{
				r = root;
			}
			else if(a[i] == ‘]‘)
			{
				r = q;
			}
			else
			{
				chan *t = new chan;
				t->x = a[i];
				t->next = r->next;
				r->next = t;
				r = t;
				//cout<<root->next->x<<endl;
				if(r->next == NULL)  q = t;
			}
		}
		r = root->next;
		while(r != NULL)
        {
            q = r;
            printf("%c" , r->x);
            r =r->next;
            delete q;
        }
        cout<<endl;
    }
	return 0;
}

用c++的string实现

#include <iostream>
#include <string.h>
#include <string>

using namespace std;

int main()
{
	string a;
	while(cin>>a)
	{
		string b;
		int n = a.size();
		int i;
		string::iterator x , y;
		x = b.begin();
		y = b.end();
		for(i = 0; i < n; i++)
		{
			if(a[i] == ‘[‘)
			{
				if(b.size == 0)  continue;
				x = b.begin();
			}
			else if(a[i] == ‘]‘)
			{
				if(b.size == 0)  continue;
				x = b.end();
			}
			else
			{
				x = b.insert(x , a[i]);
				x++;
				y = b.end();
			}
		}
		cout<<b<<endl;
	}
	return 0;
}

结果TEL

uva 11988 这题可以看出c++中string效率的底下,码迷,mamicode.com

时间: 2024-11-06 13:35:38

uva 11988 这题可以看出c++中string效率的底下的相关文章

算法题:求数组中最小的k个数

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:输入n个整数,找出其中最小的k个数. <剑指offer>给出了两种实现算法: 算法1:采用Partition+递归法,该算法可以说是快速排序和二分查找的有机结合.算法的时间复杂度为O(n),缺点在于在修改Partition的过程中会修改原数组的值. 算法2:采用top-k算法.如果要找最小的K个数,我们才用一个含有K个值的大顶堆:如果要找最大的K个数,我们采用小顶堆.该算法的时间复杂度为O(nlogK),是一种比较好的算法,启发于堆排序

微软算法100题88 将字符串中的字符&#39;*&#39;移到串的前部分

函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量.如原始串为:ab**cd**e*12,处理后为*****abcde12,函数并返回值为5.(要求使用尽量少的时间和辅助空间) 思路:类似于快速排序,用两个指针分别指向字符数组的左右边界,寻找左边第一个不为*的字符,寻找右边第一个*,然后交换字符,然后继续寻找和交换的过程,直到两个指针相交, 时间复杂度o(n), 空间复杂度o(1) 第一个写的程序有问题,没有考虑到保持

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

Broken Keyboard (a.k.a. Beiju Text) From:UVA, 11988 Time Limit: 1000 MS 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 with the keyboard is that sometimes the "hom

UVa 11988 - Broken Keyboard (a.k.a. Beiju Text) 题解

刘汝佳的题目,悲剧文本 -_-||| 这里使用vector<string>容器倒置记录数据,然后从后面输出就可以了. 难度就是不知道这样的文档到底哪里是开始输出,故此使用动态管理内存的容器比较好做. 增加了io处理的O(n)算法也没有上榜,郁闷. #include <stdio.h> #include <vector> #include <string> using std::vector; using std::string; const int MAX_

算法题——二叉树结点的中序遍历的后继结点

题目:给出二叉树的一个结点,返回它中序遍历顺序的下一个结点. 思路: 如果有指向父亲的结点,则: 如果当前结点有右儿子,或者当前结点是根结点,则后继结点为右子树的最左叶节点: 否则,如果当前结点是父结点的左儿子,则后继结点就是父结点:(其实是第三种情况的一个特例,即自己是第0代祖先,返回第一代祖先) 否则,向上遍历,直到n-1代祖先是n代祖先的左儿子,则后继结点为n代祖先:或者遍历到根节点后未找到符合的n代结点,则该结点为中序遍历的最后结点,没有后继. 时间复杂度为树的高度O(lgN). 代码:

OJ刷题常用的4中基本输入形式

初到OJ网站上刷题,输入形式就是我们要考虑的问题.通过自己的一些摸索,OJ题目的输入形式大体上无外乎4种.下面就详细介绍: 1 输入数据文件中,第一行数据标明了测试数据的数目: 2 输入数据文件中,有标明输入结束的数据 3 输入数据文件中,测试数据一直到文件尾 4 没有输入数据 第1中情形的处理方法: //int i,kase scanf("%d",&kase); for(i=1;i<=kase;i++) { //处理第i中情况 } ...................

UVa 11988 Broken Keyboard(链表的应用)

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 with the keyboard is that sometimes the "home" key or the "end" key gets automatically pressed (inter

IT公司100题-10-翻转句子中单词的顺序

问题描述: 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变. 句子中单词以空格符隔开.为简单起见,标点符号和普通字母一样处理. 例如输入“Hello world!”,则输出“world! Hello”. 分析: 先翻转各个单词,然后整体翻转即可. 参考代码: 1 // 10.cc 2 #include <iostream> 3 #include <cstring> 4 #include <string> 5 using namespace std; 6

UVA 11988 链表

之前遇到字典树什么的要不就用指针链表,要不直接上list. 数组链表主要思想和指针差不多. 指针是用*next记录下一个的地址然后形成链. 数组本身开辟空间时便是一个地址所以也可以达到这点. 比如 int a[11];     a[0]=1;   a[1]=2;  a[2]=4; a[4]=3; a[a[0]]=a[1]=2这样就达到了将 1 2 4 3 接到一起. 仔细分析一下数组a的下标再不断增大,但是记录的数据却在更新. 所以可以大致写出 int next[11]; int now=0;