AT1381 エンド・オブ・ビギニング 题解

Content

\(n\) 组询问,每组询问给定三个字符串 \(s_1,s_2,s_3\)

  • 如果 \(s_1\)BEGINNING,输出 \(s_3\) 的第一个字符。
  • 如果 \(s_1\)MIDDLE,此时保证 \(s_3\) 长度为奇数,输出 \(s_3\) 最中间的一个字符。
  • 如果 \(s_1\)END,输出 \(s_3\) 最后一个字符。

数据范围:\(s_1\) 保证是 BEGINNINGMIDDLEEND 当中的一个,\(s_2\) 保证是 OF\(|s_3|\leqslant 20,1\leqslant n\leqslant 10^4\)

Solution

设第一个字符的下标为 \(0\),也就是第一个字符为 \(s_{3,0}\)。然后根据 \(s_1\) 分类讨论:

  • 如果 \(s_1\)BEGINNING,那么答案就是 \(s_{3,0}\)
  • 如果 \(s_1\)MIDDLE,那么答案就是 \(s_{3,\left\lfloor\frac{|s_3|}{2}\right\rfloor}\)
  • 如果 \(s_1\)END,那么答案就是 \(s_{3,|s_3|-1}\)

如果你想问我为什么下标从 \(0\) 开始,这是为了更好的让你理解接下来的代码。

Code

string s1, s2, s3;

int main() {
	int n = Rint;
	while(n--) {
		cin >> s1 >> s2 >> s3;
		int len = s3.size();
		if(s1 == "BEGINNING") printf("%c", s3[0]);
		else if(s1 == "MIDDLE") printf("%c", s3[len >> 1]);
		else printf("%c", s3[len - 1]);
	}
	puts(""); //ATCoder一大feature
	return 0;
}
posted @ 2021-12-16 14:41  Eason_AC  阅读(25)  评论(0)    收藏  举报