菜菜菜,不是你怎么这么菜。
A-C
模拟即可。
D
正常的方法
因为不管怎么粘合总是一个字符串在复制,所以我们只用考虑大小写问题。
我们设字符串为 \(A\),被反转大小写的字符串为 \(B\),那么这个字符串会长这样:\(ABBABAABBAABABBA\cdots\),第一个 \(A\) 的位置是 \(0\) 的话,我们可以发现每一个 \(B\) 在二进制中的 \(1\) 的个数为奇数。
证明
我们知道,每一次反转字符串长度会乘 \(2\)。
所以字符串中的每一位象征着是经过多少次反转过后得到的。
所以每个字符串的位置在二进制下的 \(1\) 的个数就是反转大小写的次数,
那么一定是反转奇数次才可以变换样式。
幽默方法
按照上面的方法先找出字符串的样子,发现被反转后的字符串的位置在 \(\{1,2,4,7,8,11,\cdots\}\),丢到 oeis 中找到 A000069,发现规律是二进制中 \(1\) 的个数。
点击查看代码
#include<bits/stdc++.h>
#define int ll
#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define inn(i,n,a) For(i,1,n) a[i]=read();
#define ll long long
#define i128 __int128
using namespace std;
inline int read() {
int xx= 0;int f= 1;
char c = getchar();
while(c<'0'||c>'9') {
if(c=='-') f= -1;
c= getchar();
}
while(c>='0'&&c<='9') {
xx= (xx<<1)+(xx<<3)+(c^48);
c= getchar();
}
return xx*f;
}
#define maxn 200050
string s;
int q;
signed main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>s>>q;
int n=s.size();
while(q--) {
int x; cin>>x;
int a=(x-1)/n;
int cnt=0; //cout<<a<<':';
while(a) cnt+=(a&1),a>>=1;
if(!(cnt&1)) cout<<s[(x-1)%n]<<' ';
else {
int i=(x-1)%n;
if(s[i]>='a') cout<<(char)(s[i]-32)<<' ';
else cout<<(char)(s[i]+32)<<' ';
}
}
}