UVa 11988 Broken Keyboard (a.k.a. Beiju Text) (指针的"思想")

部署运行你感兴趣的模型镜像

11988 - Broken Keyboard (a.k.a. Beiju Text)

Time limit: 1.000 seconds

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=3139

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 (internally).

You're not aware of this issue, since you're focusing on the text and did not even turn on the monitor! After you finished typing, you can see a text on the screen (if you turn on the monitor).

In Chinese, we can call it Beiju. Your task is to find the Beiju text.

Input

There are several test cases. Each test case is a single line containing at least one and at most 100,000 letters, underscores and two special characters '[' and ']'. '[' means the "Home" key is pressed internally, and ']' means the "End" key is pressed internally. The input is terminated by end-of-file (EOF). The size of input file does not exceed 5MB.

Output

For each case, print the Beiju text on the screen.

Sample Input

This_is_a_[Beiju]_text
[[]][][]Happy_Birthday_to_Tsinghua_University

Output for the Sample Input

BeijuThis_is_a__text
Happy_Birthday_to_Tsinghua_University

思路:

首先,这道题可以用链表实现(用deque更快

但我们不妨用一种"指针"的思想来解决问题。

开一个next[]数组用以标记下一个预输出的位置,从而隐性地完成对原字符串的重排。

最后,通过遍历next[]数组完成输出。


完整代码:

/*0.059s*/

#include<cstdio>

char s[100005];
int next[100005];///next[i]指向了下一个要输出的字符的位置

int main()
{
	while (gets(s))
	{
		int now = 0, front = 0, back = 0;
		next[0] = 0;
		for (int i = 0; s[i]; ++i)
			if (s[i] == '[') now = 0, front = next[0];
			else if (s[i] == ']') now = back, front = 0;
			else
			{
				next[now] = i + 1; ///记录now位置后面的要输出的位置
				now = i + 1;
				if (front) next[i + 1] = front; /// 模拟:把该字符加到队首
				else next[i + 1] = 0, back = i + 1; ///0为end标记
			}
		for (int i = next[0]; i; i = next[i])
			putchar(s[i - 1]);
		putchar(10);
	}
	return 0;
}

您可能感兴趣的与本文相关的镜像

Qwen3-8B

Qwen3-8B

文本生成
Qwen3

Qwen3 是 Qwen 系列中的最新一代大型语言模型,提供了一整套密集型和专家混合(MoE)模型。基于广泛的训练,Qwen3 在推理、指令执行、代理能力和多语言支持方面取得了突破性进展

代码概述 题目中每位读者只喜欢一本书(“最喜欢的图书”),若两人喜欢的书相同,则互为潜在朋友。对于每个读者,其潜在朋友数等于其他喜欢同一本书的人数。 注意:读者编号从 1 到 N,输入第 $ i $ 行对应读者 $ i-1 $?但描述有误! 再看输入说明: > 第 i (i = 1, 2, …, N) 行表示读者 i - 1 最喜欢的图书 即: - 第1行 → 读者0 - 第2行 → 读者1 - ... - 第N行 → 读者N-1 但输出要求: > 第 i 行表示读者 i 有几个潜在朋友 这里出现矛盾:读者编号到底是从 0 开始还是 1 开始? 继续分析输入样例: ``` 4 5 2 ← 读者0 喜欢书2 3 ← 读者1 喜欢书3 2 ← 读者2 喜欢书2 1 ← 读者3 喜欢书1 ``` 喜欢情况: - 书2:被读者0 和 读者2 喜欢 → 各有 1 个潜在朋友(彼此) - 书3:仅读者1 → 没有共同读者 → 输出 BeiJu - 书1:仅读者3 → 输出 BeiJu 所以输出应为: ``` 1 ← 读者0 有1个潜在朋友 BeiJu ← 读者1 没有 1 ← 读者2 有1个 BeiJu ← 读者3 没有 ``` 但题目说:“第 i 行的数表示读者 i 有几个潜在朋友” 即: - 第1行 → 读者1? - 第2行 → 读者2? 但输入是“读者 i-1”,说明内部编号从0开始,而输出按顺序对应输入顺序即可。 实际上,输出第 i 行对应第 i 个输入读者(即读者 i-1),但题目要求“第 i 行表示读者 i”——这明显冲突。 **结论**:题中“读者 i”实指第 i 个读者(按输入顺序),编号从1到N。我们只需按输入顺序处理并输出即可,无需真实编号映射。 因此,直接按顺序读取、统计、输出即可。 --- ### ✅ 正确代码实现: ```cpp #include <iostream> using namespace std; int main() { int N, M; cin >> N >> M; int fav[200]; // fav[i] 表示第 i 个读者喜欢的书 int bookCount[201] = {0}; // bookCount[p] 表示喜欢书 p 的人数 // 读入每个读者最喜欢的一本书 for (int i = 0; i < N; i++) { cin >> fav[i]; bookCount[fav[i]]++; } // 对每个读者,计算其潜在朋友数量 for (int i = 0; i < N; i++) { int friends = bookCount[fav[i]] - 1; // 减去自己 if (friends == 0) { cout << "BeiJu" << endl; } else { cout << friends << endl; } } return 0; } ``` ✅ 输入样例执行过程: - 书2:出现2次 → 读者0和读者2 → 各得 2-1=1 - 书3:1次 → 读者1 → 0 → 输出 BeiJu - 书1:1次 → 读者3 → 0 → 输出 BeiJu 输出: ``` 1 BeiJu 1 BeiJu ``` 完全匹配。 --- 知识点 - **频次统计**:用数组统计每本书被多少人喜欢,支持快速查询。 - **潜在朋友定义**:喜欢同一本书的其他人均为潜在朋友,总数减一即可。 - **输出逻辑控制**:根据朋友数是否为零决定输出数值或“BeiJu”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值