上海计算机学会2020年3月月赛C++乙组T1浏览器
发布时间
阅读量:
阅读量
题目描述
所有的网页浏览器都有访问、前进与后退按钮,它们的工作原理如下:
- 用户在进行"访问"操作时需提供一个具体的网址,在线浏览完成后将该页面设为当前页面,并将其直接导航目标设为跳转之前的页面;
- 当执行"后退"操作时, 系统会检查当前所在的网页是否有后续链接, 如果存在则会前往该后续链接所在的页面;
- "前进"行为主要用于撤销刚执行过的"后退"动作:
- 如果上一步是"后退"行为, 则会返回到"后退"之前所在的页面;
- 如果上一步是"访问"行为, 则此条"前进"指令将被忽略;
- 如果上一步同样是执行了几次连续的"前进", 需要判断此次是否已经撤销了一个先前的"后退":如果是的话, 则按照之前的记录继续处理;否则则忽略这次执行的行为。
基于给定的 n 条操作,请您请求浏览器模拟其行为,并输出每次操作对应的网址。
输入格式
第一行:单个正整数 n 表示操作数量;
接下来 n 行:每行表示一步操作,
登录系统时,请确保链接以字母 v 开始,并且不允许存在空白或其他不可见字符。
- 后退 仅有一个字母
b; - 前进 仅有一个字母
f。
输出格式
共 n 行:对每一步操作,
- 当浏览器访问某个指定的URL时,请返回该URL;
- 若浏览器未执行此操作,请返回问号符号。
数据范围
保证每个输入的网址长度不会超过 3030;
- 对于 30% 的数据,1≤n≤1000;
- 对于 60% 的数据,1≤n≤10000;
- 对于 100% 的数据,1≤n≤50000。
样例数据
输入:
10
v iai.sh.cn
v scs.sh.cn
v yacs.club
b
b
f
f
f
v ioinformatics.org
f
输出:
iai.sh.cn
scs.sh.cn
yacs.club
scs.sh.cn
iai.sh.cn
scs.sh.cn
yacs.club
?
ioinformatics.org
?
输入:
8
v iai.sh.cn
v taobao.com
v baidu.com
b
b
v tmall.com
f
b
输出:
iai.sh.cn
taobao.com
baidu.com
taobao.com
iai.sh.cn
tmall.com
?
iai.sh.cn
通过采用string数组的方式进行操作,并将详细内容可参考代码部分
#include <bits/stdc++.h>
using namespace std;
string a[50005];
int p;
int main() {
int n;
int limit = 1;
cin >> n;
p = 1;
for (int i = 1; i <= n; i++) {
char c;
cin >> c;
if (c == 'v') {
p++;
cin >> a[p];
limit = p;
cout << a[p] << endl;
} else if (c == 'b') {
if (p <= 2) {
cout << "?" << endl;
} else {
p--;
cout << a[p] << endl;
}
} else if (c == 'f') {
if (p >= limit) {
cout << "?" << endl;
} else {
p++;
cout << a[p] << endl;
}
}
}
return 0;
}
也可以采用两个栈来模拟:
详见代码:
#include <bits/stdc++.h>
using namespace std;
stack <string> q;//前继
stack <string> h;//后继
int n;
string c;
int main() {
cin >> n;
while (n--) {
char op;
cin >> op;
if (op == 'v') {//浏览
cin >> c;
while (!h.empty()) {//清空后继
h.pop();
}
q.push(c);//压入前继
cout << c << endl;//直接输出
} else if (op == 'b') {//后退
if (q.size() >= 2) {//有前继
c = q.top();//弹出当前网站
q.pop();
cout << q.top() << endl;//输出前继
h.push(c);//压入后继
} else {
cout << "?" << endl;//无前继,输出问号
}
} else if (op == 'f') {//前进
if (!h.empty()) {//如果有后继
cout << h.top() << endl;//输出
c = h.top();//弹出后继
h.pop();
q.push(c);//压入前继
} else {
cout << "?" << endl;//没有后继,输出问号
}
}
}
return 0;
}
全部评论 (0)
还没有任何评论哟~
