概述
1005 Rikka with Game
题意:给定一个字符串s,两个人轮流操作,每次操作有两种选择:1、终止操作进行结算;2、选择一个字符,将其变成下一个字符('a'->'b','b'->'c',...'z'->'a')。第一个操作的人想要s的字典序尽可能小,第二个操作的人想要s的字典序尽可能大,两个人都选择最优策略的情况下,求2^101轮之后的结果。
解题过程:一开始mxy推算出单个字符的情况,单个字符的情况下,'z'会在'b'的时候停止,而其他的字符是原样不动。我们确认后,以此提交了一发WA。但是很快我找到一个反例,就是"yz",第一个人一定会把'z'变成'a',而第二个人也不得不把'a'变成'b',由此我们猜测是要把第一个'z'变成'b',推算出更多的两个字符、三个字符的情况后,我们发现'y'字符是平衡的局面,大家都不敢动,直接进入下一个字符的博弈,而比'y'小的字符,第一个人一定会在第一步就宣布终止操作,比'y'大的字符,也就是'z',第一个人一定会把它变成'a',那么第二个人一定会把它变成'b',这个时候第一个人一定要选择结算了。
所以得到的策略就是,从左往右选择第一个非'y'的字符,假如它是'z',则变成'b',无论是不是'z',非'y'或者遇到字符串结尾就终止。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[100 + 5];
int main() {
#ifdef Inko
freopen("Inko.in", "r", stdin);
#endif // Inko
int T;
scanf("%d", &T);
while(T--) {
scanf("%s", s);
for(int i = 0; s[i] != '