2020安徽省大学生程序设计大赛题解——H 字幕校对

2020安徽省大学生程序设计大赛题解——H 字幕校对

H 字幕校对

伴随着中国国产影视作品风靡国外,听不懂汉语的观众需要英文字幕的帮忙才能理解影片故事情节。现在小喇叭接到了这样一个任务,他需要按照标准.STA字幕格式的需要,对字幕文件进行编辑。标准英文字母格式如下:
[Ordinal number of the block]
[Beginning time of the subtitles --> Ending time of the subtitles]
[Subtitle text in one or more lines]
每两个字幕信息之间用一行空行隔开。时间格式为HH:MM:SS,TTT(注意是英文的冒号和逗号),表示小时:分钟:秒,毫秒。
这是一个.STA格式文件的样例:
1
00:00:01,600 --> 00:00:04,200Good day!
2
00:00:05,900 --> 00:00:07,999
Good day to you too!
Here you go!
3
00:00:10,000 --> 00:00:14,000
May l please have ten garlic sausages?
由于影片播放时需要对原有视频进行编辑以适应播出时长,所以字母文件也要做适当的调整,因此小喇叭的任务就是编写程序完成对字幕文件的编辑。

题目

在这里插入图片描述

标签

字符串、排序、模拟

分析

本题唯一的难点在于巧妙的处理表示时间的字符串,其余部分无论是思维还是代码层面都没有太大难度,下面我们着重介绍字符串的处理部分。

在本题中,对字符串的处理有三种方法:

  • 逐位处理
  • s s c a n f sscanf sscanf匹配
  • 用正则表达式匹配

其中第一种方法虽然较为麻烦,但时间上并不占劣势,而且不耽误思考与调试的时间,不失为考场上的一种选择。第三种方法要求使用 C + + 11 C++11 C++11并使用 r e g e x regex regex库,如果换成 P y t h o n Python Python,那本题使用正则匹配当然可以迎刃而解, C + + 11 C++11 C++11的正则匹配与 P y t h o n Python Python的正则匹配有异曲同工之妙,这里也不再赘述。

这里我们用 s s c a n f sscanf sscanf对字符串进行匹配,和正则表达式不同的地方在于, s s c a n f sscanf sscanf适用于已知字符串格式时的做法,而正则表达式对此没有较高的要求。

图H-1
图 H − 1      C + + 帮 助 文 档 对 s s c a n f 的 解 释 图H-1 \ \ \ \ C++帮助文档对sscanf的解释 H1    C++sscanf

考虑到时间字符串的格式固定为 % d : % d : % d , % d − − > % d : % d : % d , % d \%d:\%d:\%d,\%d --> \%d:\%d:\%d,\%d %d:%d:%d,%d>%d:%d:%d,%d,我们只需要用 s s c a n f sscanf sscanf处理即可。

然后,我们把时间转化为以毫秒为单位的数据,与校对时间差相加后,即可得到校对后的以毫秒为单位的时间,再将其换算到各个单位组成的时间即可得出答案。

输出的时候用 p r i n t f _ s ( " % 02 d : % 02 d : % 02 d , % 03 d − − > % 02 d : % 02 d : % 02 d , % 03 d " ) printf\_s("\%02d:\%02d:\%02d,\%03d --> \%02d:\%02d:\%02d,\%03d") printf_s("%02d:%02d:%02d,%03d>%02d:%02d:%02d,%03d")控制输出格式即可。

参考答案(C++)
//Using C++11
#include<bits/stdc++.h>
#include<regex>
using namespace std;

struct Time {
	string num;
	int btime, etime;
	string context;
};

vector<Time> v;

int main() {
	string snum, stime, sword;
	int x;
	while (cin >> snum) {
		if (snum == "#") break;
		cin.get();
		getline(cin, stime);
		char* cha = (char*)stime.data();
		int hour1, minute1, second1, hm1;
		int hour2, minute2, second2, hm2;
		sscanf_s(cha, "%d:%d:%d,%d --> %d:%d:%d,%d", &hour1, &minute1, &second1, &hm1,
			&hour2, &minute2, &second2, &hm2);
		Time temp;
		temp.num = snum;
		temp.btime = ((hour1 * 60 + minute1) * 60 + second1) * 1000 + hm1;
		temp.etime = ((hour2 * 60 + minute2) * 60 + second2) * 1000 + hm2;
		getline(cin, sword);
		temp.context = sword;
		v.push_back(temp);
	}
	cin >> x;
	for (Time temp : v) {
		cout << temp.num << endl;
		temp.btime += x;
		temp.etime += x;
		printf_s("%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\n",
			temp.btime / 3600000, temp.btime / 60000 % 60, temp.btime % 60000 / 1000, temp.btime % 1000,
			temp.etime / 3600000, temp.etime / 60000 % 60, temp.etime % 60000 / 1000, temp.etime % 1000);
		cout << temp.context << endl;
	}
	cout << '#' << endl;
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值