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 @   zxzhang  阅读(267)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示

目录导航