B. AquaMoon and Stolen String
题意:
给了奇数个字符串,每两个能配成一对,也能进行相应位置的交换,问哪个字符串没有被交换过。
思路:
可以发现是相应位置交换,例如 下标位置1交换 那么始终都在下标位置为1上 所以只需要把相应位置ASALL码相加, 再减去最后输入的那n-1个字符串 直接输出即可。
最开始没有注意相应位置交换, 要多多读题,直接统计所有字母出现的次数, 显然是不对的。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5 + 10;
typedef pair <int, int> PII;
int main()
{
int t;//只会交换相同位置的字符串
scanf("%d", &t);
while(t --)
{
int n, m;
scanf("%d %d", &n, &m);
string str[300000 + 100];
for(int i = 1 ; i <= n + n - 1; i ++)
{
cin >> str[i];
}
string ans;
// printf("kjad\n");
for(int i = 0 ; i < m ; i ++)
{
int t = 0;
for(int j = 1 ; j <= n ; j ++)
{
t += str[j][i];
}
for(int j = n + 1 ; j <= n + n - 1; j ++)
{
t -= str[j][i];
}
char c = t;
ans += c;
}
cout << ans << "\n";
}
return 0;
}
C. AquaMoon and Strange Sort
题意:
一个数组,有n个数,数字可能不唯一,之间随意进行冒泡排序,初始状态都向右,问能否把所有数字按照非递减顺序排序,并且朝向都向右。
思路:
可以发现任何位置的数字交换偶数次肯定能保证方向向右, 那么再细分, 奇数位置上的数到奇数位置, 偶数位置上的数到偶数位置。那么所以只要最初 奇数位置上的数和偶数位置上的数 最后也出现在 最终状态上的奇数位置和偶数位置即可。分别统计 即可。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <unordered_map>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5 + 10;
typedef pair <int, int> PII;
int a[maxn];
int book[maxn][2];
int main()
{
int t;
scanf("%d", &t);
while(t --) //奇数位置到奇数位置 偶数到偶数就行
{
int n; //只要交换次数为偶数就行
scanf("%d", &n);
memset(book, 0, sizeof(book));
for(int i = 1 ; i <= n ; i ++)
{
scanf("%d", &a[i]);
book[a[i]][i % 2] ++;//分为奇数和偶数进行统计
}
sort(a + 1 , a + n + 1);
for(int i = 1 ; i <= n ; i ++)
{
book[a[i]][i % 2] --;//分为奇数和偶数
}
bool flog = true;
for(int i = 1 ; i <= n ; i ++)
{
if(book[a[i]][i % 2])
{
flog = false;
break;
}
}
if(flog)
printf("YES\n");
else printf("NO\n");
}
return 0;
}