UVa 11998 Broken Keyboard (数组模拟链表问题)

题目链接: 传送门

Broken Keyboard

#include<bits/stdc++.h>
using namespace std;
char str[100010];
int main()
{
	while(scanf("%s",str)!=EOF)
	{
		deque<int > q;
		int i=0;
		while(str[i]=='['||str[i]==']')  i++;
		q.push_front(i);
		while(str[i])
		{
			if(str[i]=='[')
			{
				q.push_front(i+1);
				str[i]='\0';
			}
			else if(str[i]==']')
			{
				q.push_back(i+1);
				str[i]='\0';
			}
			i++;
		}
		while(!q.empty())
		{
			printf("%s",str+q.front());
			q.pop_front();
		}
		printf("\n");

	}
	return 0;
}

刘汝佳版

// UVa11988 Broken Keyboard
// Rujia Liu
#include<cstdio>
#include<cstring>
const int maxn = 100000 + 5;
int last, cur, next[maxn]; // 光标位于cur号字符的后面
char s[maxn];

int main()
{
	while(scanf("%s", s+1) == 1)
	{
		int n = strlen(s+1); // 输入保存在s[1], s[2]...中
		last = cur = 0;
		next[0] = 0;

		for(int i = 1; i <= n; i++)
		{
			char ch = s[i];
			if(ch == '[')
			{
				cur = 0;
			}
			else if(ch == ']')
			{
				cur = last;
			}
			else
			{
				next[i] = next[cur];
				next[cur] = i;
				if(cur == last) // 更新“最后一个字符”编号
				{
					last = i;
				}
				cur = i; // 移动光标
			}
		}
		for(int i = next[0]; i != 0; i = next[i])
			printf("%c", s[i]);
		printf("\n");
	}
	return 0;
}
posted @ 2016-04-15 14:52  zxzhang  阅读(264)  评论(0编辑  收藏  举报