题解:AT_abc380_d [ABC380D] Strange Mirroring
目前洛谷最优解。
题意简述
对于一个给定的字符串
分析
暴力模拟自然是不行的。
由于每一次操作都会使长度变成原来的两倍,所以我们考虑可能结果与二进制有关。然后我们发现对于第
我们记首次字符串为第 __builtin_popcount 可用于求位 1 出现次数和 __builtin_parity 可用于求 1 的数目的奇偶性,这两个函数效率都非常高。
注意要在两个函数末尾加 ll 以将参数改成 unsigned long long。
于是得出代码。
代码
#include<bits/stdc++.h>
using namespace std;
template<typename T>
inline T read(void)
{
static T ans=0;
static char ch;
ans=0;
do{ch=getchar();}while(!isdigit(ch));
do{ans*=10;ans+=ch-'0';}while(isdigit(ch=getchar()));
return ans;
}
inline constexpr char rev(char c)
{
if(c<='Z')c+='a'-'A';
else c-='a'-'A';
return c;
}
int main()
{
char str[200007];
long long q,k,len;
scanf("%s",str);
q=read<long long>();
len=strlen(str);
while(q--)
{
k=read<long long>();
k--;
long long r=k/len;
if(__builtin_parityll(r))
putchar(rev(str[k-r*len]));
else
putchar(str[k-r*len]);
putchar(' ');
}
return 0;
}