A - Spell Check
考察是否只有这几个字符出现。用map记录一下即可。
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int>
#define vi vector<int>
char a[5]={'T','i','r','m','u'};
void solve()
{
int n;
cin>>n;
string s;
cin>>s;
if(n!=5){
cout<<"No"<<endl;
return ;
}
map<char ,int> mp;
for (int i=0;i<n;i++){
mp[s[i]]++;
}
for (int i=0;i<5;i++){
if(mp[a[i]]!=1){
cout<<"NO"<<endl;
return ;
}
}
cout<<"Yes"<<endl;
}
signed main()
{
IOS
int t;
cin>>t;
while(t--){
solve();
}
}
B - Colourblindness
简单的遍历一下,将特殊的情况考虑到即可。
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int>
#define vi vector<int>
char a[2][110];
void solve()
{
int n;
cin>>n;
for (int i=0;i<2;i++){
for (int j =0;j<n;j++){
cin>>a[i][j];
}
}
for (int i=0;i<n;i++){
if(a[0][i]==a[1][i]){
continue;
}
else if (a[0][i]=='G' && a[1][i]=='B'){
continue;
}
else if (a[0][i]=='B' && a[1][i]=='G'){
continue;
}
else {
cout<<"NO"<<endl;
return ;
}
}
cout<<"Yes"<<endl;
}
signed main()
{
IOS
int t;
cin>>t;
while(t--){
solve();
}
}
C - Word Game
任然可以开一个map 记录每个字符串出现的次数,用二维字符串来将记录总的字符串,每次取三个即可。
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int>
#define vi vector<int>
void solve()
{
int n;
cin>>n;
vi a(3);
string s[3];
map<string,int> mp;
for (int i=0;i<3;i++){
for (int j=1;j<=n;j++){
string s1;
cin>>s1;
mp[s1]++;
s[i]+=s1;
}
}
for (int i=0;i<3;i++){
for (int j=0;j<s[i].size();j+=3){
string s1="";
s1+=s[i][j];
s1+=s[i][j+1];
s1+=s[i][j+2];
if(mp[s1]==1){
a[i]+=3;
}
else if (mp[s1]==2){
a[i]+=1;
}
}
}
for (int i=0;i<3;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
signed main()
{
IOS
int t;
cin>>t;
while(t--){
solve();
}
}
D - Line
先将未改变之前的总数记录,然后枚举每一位并记录改变后对于总数的贡献,并对这个记录的数组进行排序,将最大贡献的排在前面。最后在按位进行相加即可。(当贡献小于0时,可以选择不加上这个贡献)。
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int>
#define vi vector<int>
void solve()
{
int n;
cin>>n;
string s;
cin>>s;
vi a(n);
int ans=0;
for (int i=0;i<n;i++){
if(s[i]=='L'){
ans+=i;
a[i]+=(n-1-i)-i;
}
else {
ans+=n-1-i;
a[i]+=i-(n-1-i);
}
}
sort(all(a),greater());
for (int i=0;i<n;i++){
ans+=max((int)0,a[i]);
cout<<ans<<" ";
}
cout<<endl;
}
signed main()
{
IOS
int t;
cin>>t;
while(t--){
solve();
}
}
E - Counting Rectangles
这题可以采用二维前缀和的做法。将高作为行,宽作为列,用坐标记录这样一个矩形的面积。
最后只要求出右下角坐标位(hb-1,wb-1) 左上角坐标位(hs+1,ws+1)的前缀和数组的面积即可。
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int>
#define vi vector<int>
const int N= 100010;
int a[1010][1010];
int s[1010][1010];
void solve()
{
int n,q;
cin>>n>>q;
for (int i=0;i<=1000;i++){
for (int j=0;j<=1000;j++){
a[i][j]=s[i][j]=0;
}
}
for (int i=1;i<=n;i++){
int h,w;
cin>>h>>w;
a[h][w]+=h*w;
}
for (int i=1;i<=1000;i++){
for (int j=1;j<=1000;j++){
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
}
}
for (int i=1;i<=q;i++){
int h1,h2,w1,w2;
cin>>h1>>w1>>h2>>w2;
cout<<s[h2-1][w2-1]-s[h2-1][w1]-s[h1][w2-1]+s[h1][w1]<<endl;
}
}
signed main()
{
IOS
int t;
cin>>t;
while(t--){
solve();
}
}
G - Even-Odd XOR
题意位奇数位上的数异或和等于偶数位上的数的异或和。可理解为总异或和为0。
所以改为要求一个没有重复的数的异或和为0的序列。
可以先从第一位到第n-3 为放任意不相等的数,可以为1--n-3. 但前n-3 位的异或和不能等于n-2 位。所以如果前n-3 位的异或和等于n-2 位就放另一个没出现过的数 eg:n-1 .
此时还要注意一个问题,就是前n-2 位的异或和要等于第n位数,但第n位数不能出现过。所以我们可以将d第n-2 位数设为一个极大的数(2^30) 这样的话可以保证第三十位始终不被占用从而使得第n位不出现过。
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int>
#define vi vector<int>
#define si set<int>
#define mi map<int,int>
#define mc map<char,int>
void solve()
{
int n;
cin>>n;
vi a;
int sum=0;
for (int i=1;i<=n-3;i++){
a.push_back(i);
sum^=i;
}
if((sum^(n-2))==0){
sum^=(n-1);
a.push_back(n-1);
}
else {
a.push_back(n-2);
sum^=(n-2);
}
a.push_back(1<<30);
sum^=(1<<30);
a.push_back(sum);
for (auto x : a){
cout<<x<<" ";
}
cout<<endl;
}
signed main()
{
IOS
int t;
cin>>t;
while(t--){
solve();
}
}