Educational Codeforces Round 51 Editorial
A. Vasya And Password
题意:枚举各种情况。
#include<string>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
#include<set>
#include<cctype>
#define rep(a,b) for(register int i=a;i<=b;i++)
#define red(a,b) for(register int i=a;i>=b;i--)
#define unsigned long long ULL
#define long long LL
using namespace std;
string s;
string t;
int cnt[4];
int main()
{
int T;
cin >> T;
while (T--)
{
cin >> s;
t = s;
memset(cnt, 0, sizeof(cnt));
int pre;
for (int i = 0; i < s.size(); i++)
{
if (s[i] <= 'z'&&s[i] >= 'a')t[i] = '1', cnt[1]++;
if (s[i] <= 'Z'&&s[i] >= 'A')t[i] = '2', cnt[2]++;
if (s[i] <= '9'&&s[i] >= '0')t[i] = '3', cnt[3]++;
}
if (cnt[1] && cnt[2] && cnt[3])cout << s <<endl;
else
{
if (cnt[1] && cnt[2])
{
pre = cnt[1] > cnt[2] ? 1 : 2;
for (int i = 0; i < t.size(); i++)
{
if (t[i] - '0' == pre)
{
s[i] = '0';
break;
}
}
}
else if (cnt[2] && cnt[3])
{
pre = cnt[2] > cnt[3] ? 2 : 3;
for (int i = 0; i < t.size(); i++)
{
if (t[i] - '0' == pre)
{
s[i] = 'a';
break;
}
}
}
else if (cnt[1] && cnt[3])
{
pre = cnt[1] > cnt[3] ? 1 : 3;
for (int i = 0; i < t.size(); i++)
{
if (t[i] - '0' == pre)
{
s[i] = 'A';
break;
}
}
}
else
{
if (cnt[1])
{
s[0] = 'A';
s[1] = '0';
}
if (cnt[2])
{
s[0] = 'a';
s[1] = '0';
}
if (cnt[3])
{
s[0] = 'a';
s[1] = 'A';
}
}
cout << s<<endl;
}
}
//system("pause");
}
B. Relatively Prime Pairs
题意:找2n范围内的n对互质数,相邻互质
int main()
{
LL l, r;
cin >> l >> r;
cout<<"YES"<<endl;
for (LL i = l; i <= r; i+=2)
{
cout << i << " " << i + 1 << endl;
}
//system("pasue");
}
C. Vasya and Multisets
题意:把序列分成两半,两边出现单次的数的数量相同。
模拟即可。
计算出初始出现次数,出现1次的如果是偶数直接各取一半。
出现2次的完全不影响(可以分成一边一个)
出现2次以上的可以分出一个只影响一边。
判断:出现1次为奇数:是否能通过出现2次以上的去影响。
int main()
{
memset(B, 0, sizeof(B));
int n;
cin >> n;
rep(1, n)
{
cin >> A[i];
B[A[i]]++;
}
int pre=0;
rep(1, n)
{
if (B[A[i]] == 1)
{
v1.push_back(i);
}
else if(B[A[i]]>2)
{
v2.push_back(i);
}
}
if (v1.size() % 2 && v2.size() == 0)
{
cout << "NO" << endl;
}
else
{
int cnt = 1;
if (v1.size() % 2 == 0)
{
for (int a : v1)
{
if (cnt <= v1.size() / 2)
{
ans1.push_back(a);
cnt++;
}
else ans2.push_back(a);
}
}
else
{
for (int a : v1)
{
if (cnt <= v1.size() / 2)
{
ans1.push_back(a);
cnt++;
}
else ans2.push_back(a);
}
pre = v2[0];
}
for (int a : ans1)
{
res[a] = 'A';
}
for (int b : ans2)
{
res[b] = 'B';
}
for (int i = 1; i <= n; i++)
{
if (B[A[i]] > 1)
{
res[i] = 'B';
}
}
if (pre)res[pre] = 'A';
res[n + 1] = '\0';
cout << "YES" << endl;
cout << res+1 << endl;
}
//system("pause");
}
D. Bicolorings
题意:
递推DP,判断4种情况对4种情况的影响,一列一列递推过去。
0、1、2、3分别对应无色,上一色,下一色,双色。
因为只有两行直接可以枚举出来
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<map>
#include<vector>
#include<set>
#include<cctype>
#define rep(i,a,b) for(register int (i)=(a);(i)<=(b);(i)++)
#define ULL unsigned long long
#define LL long long
#define MOD 998244353
using namespace std;
LL dp[1100][2500][4];
void init()
{
memset(dp, 0, sizeof(dp));
dp[1][1][0] = 1;
dp[1][1][3] = 1;
dp[1][2][1] = 1;
dp[1][2][2] = 1;
}
int main()
{
int k, n;
cin >> n >> k;
init();
rep(i, 2, n)
{
rep(j, 1, k)
{
dp[i][j + 1][0] = (dp[i - 1][j][3]+dp[i][j+1][0])%MOD;
dp[i][j + 2][1] = (dp[i - 1][j][2]+dp[i][j+2][1])%MOD;
dp[i][j + 1][1] = (dp[i][j+1][1]+dp[i - 1][j][0] + dp[i - 1][j][3])%MOD;
dp[i][j + 2][2] = (dp[i - 1][j][1]+dp[i][j+2][2])%MOD;
dp[i][j + 1][2] = (dp[i - 1][j][0] + dp[i - 1][j][3]+dp[i][j+1][2])%MOD;
dp[i][j + 1][3] = (dp[i][j+1][3]+dp[i - 1][j][0])%MOD;
dp[i][j][0] = (dp[i][j][0] + dp[i - 1][j][0] + dp[i - 1][j][1] + dp[i - 1][j][2])%MOD;
dp[i][j][1] = (dp[i][j][1]+dp[i - 1][j][1])%MOD;
dp[i][j][2] = (dp[i][j][2]+dp[i - 1][j][2])%MOD;
dp[i][j][3] = (dp[i - 1][j][3] + dp[i - 1][j][1] + dp[i - 1][j][2]+dp[i][j][3])%MOD;
/*
cout << j << ":" << endl;
cout << dp[i][j][0] << endl;
cout << dp[i][j][1] << endl;
cout << dp[i][j][2] << endl;
cout << dp[i][j][3] << endl;
cout << endl;
*/
}
}
cout << (dp[n][k][0] + dp[n][k][1] + dp[n][k][2] + dp[n][k][3])%MOD << endl;
//system("pause");
}