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\) 保证是 BEGINNING
、MIDDLE
、END
当中的一个,\(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;
}