A、Reverse and Concatenate
题意:就是给你一个字符串,然后经过k次翻转能得到多少种不同的字符串,他问的其实是一次变化的可能数。
思路:如果这个串是回文串,无论怎么变化都是一种,如果这个串不是回文串,经历过一次变化也会变成回文串
所以答案显然易见:
原串是回文串或者操作为0的情况下:1
否则是:2
int t;
read(t);
while(t--)
{
cin >> n >> k >> s;
string tmp;
for(int i = s.size()-1;i>=0;--i) tmp+=s[i];
if(tmp==s||k==0) puts("1");
else puts("2");
}
B、 Fortune Telling
题意:两个起始数,一个目标数,对两个起始数进行数组n中每个数字的xor或加操作(按顺序从1-n),看哪个数能得到目标数,题目案例解释得很清楚
思路:其实xor或加一个数,对于一个数最后一位二进制的改变是没有区别的,我们只需要选择其中一个起始数累加数组的和,判断奇偶是否跟目标数的奇偶相同即可。(这是赛时我的理解)
#include <bits/stdc++.h>
#define go continue
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fory(i,a,b) for(int i = a; i <= b; ++i)
using namespace std;
template <typename T> inline void read(T& t)
{
int f = 0, c = getchar();
t = 0;
while (!isdigit(c)) f |= c == '-', c = getchar();
while (isdigit(c)) t = t * 10 + c - 48, c = getchar();
if (f) t = -t;
}
template <typename T> void print(T x)
{
if (x < 0) x = -x, putchar('-');
if (x > 9) print(x / 10);
putchar(x % 10 + 48);
}
const int N = 100100;
int n, x, y, ok;
int a[N];
signed main()
{
int t;
read(t);
while(t--)
{
read(n), read(x), read(ok);
int sum = x;
fory(i, 1, n)
{
read(a[i]);
sum += a[i];
}
if((sum & 1) == (ok & 1)) puts("Alice");
else puts("Bob");
}
return 0;
}
C、OKEA
题意:就是给你从1-n*k的数,把他们分成k个子集,每个子集的平均数%k必须是0
思路:特判一下k时1的情况,然后只有n是偶数的时候,才存在YES,构造输出结果就好
#include <bits/stdc++.h>
#define go continue
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fory(i,a,b) for(int i = a; i <= b; ++i)
using namespace std;
template <typename T> inline void read(T& t)
{
int f = 0, c = getchar();
t = 0;
while (!isdigit(c)) f |= c == '-', c = getchar();
while (isdigit(c)) t = t * 10 + c - 48, c = getchar();
if (f) t = -t;
}
template <typename T> void print(T x)
{
if (x < 0) x = -x, putchar('-');
if (x > 9) print(x / 10);
putchar(x % 10 + 48);
}
int n, k;
signed main()
{
int t;
read(t);
while(t--)
{
read(n), read(k);
if(k == 1)
{
puts("YES");
fory(i, 1, n)
{
print(i);
puts("");
}
go;
}
if(n % 2 == 0)
{
puts("YES");
int d = 0, len = n * k;
//fory(i,1,n*k)
for(int i = 1; i <= len; i += 2)
{
print(i);
putchar(' ');
d++;
if(d % k == 0) puts("");
}
for(int i = 2; i <= len; i += 2)
{
print(i);
putchar(' ');
d++;
if(d % k == 0) puts("");
}
}
else puts("NO");
}
return 0;
}