A - 123233
题意
给个\(6\)位数,判断是否是\(1\)个\(1\),\(2\)个\(2\),\(3\)个\(3\)。
思路
模拟。
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
void solve()
{
string s;
cin >> s;
int a = 0, b = 0, c = 0;
for (int i = 0; i < s.length(); i++)
{
if (s[i] == '1')
{
a++;
}
else if (s[i] == '2')
{
b++;
}
else if (s[i] == '3')
{
c++;
}
}
if (a == 1 && b == 2 && c == 3)
{
cout << "Yes" << endl;
return;
}
cout << "No" << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
//cin >> T;
while (T--)
{
solve();
}
return 0;
}
B - Hurdle Parsing header
题意
给个字符串,输出被"|"隔开的"-"每块有几个。
思路
模拟。
代码
点击查看代码
C - Move Segment
题意
给个\(01\)串,可以分为\(1\)-块和\(0\)-块(连续的\(1\)/\(0\))。现在将第\(k\)个\(1\)-块移动到第\(k-1\)个\(1\)-块之后,输出移动后的字符串。(题目保证至少有\(k\)个\(1\)-块)
思路
刚开始自己模拟\(wa\)了,后来发现题目已经告诉答案了:
那就记录一下每个\(1\)-块的起始、结束位置按上边的写。
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
int st[mxn], ed[mxn];
void solve()
{
int n, k;
cin >> n >> k;
string s;
cin >> s;
int cnt = 1, t = 0;
for (int i = 0; i < s.length(); i++)
{
if (s[i] == '1')
{
if (!t)
{
st[cnt] = i;
}
t++;
}
else
{
if (t)
{
ed[cnt] = i - 1;
cnt++;
t = 0;
}
}
}
if (t)
{
ed[cnt] = s.size() - 1;
}
string ans = s;
for (int j = ed[k - 1] + (ed[k] - st[k]) + 2; j <= ed[k]; j++)
{
ans[j] = '0';
}
for (int i = ed[k - 1] + 1; i <= ed[k - 1] + (ed[k] - st[k]) + 1; i++)
{
ans[i] = '1';
}
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
//cin >> T;
while (T--)
{
solve();
}
return 0;
}
D - Strange Mirroring
题意
给定字符串\(s\),进行如下操作10^{100}次:颠倒\(s\)中的大小写得到\(t\),令\(s = s + t\)。后有\(q\)次询问,输出每次询问\(s\)中第\(k\)个位置的字符。
思路
容易发现每次字符串的出都会\(×2\),那就看要查询的位置是在当前字符串的前半段还是后半段,前者不需要颠倒大小写,后者需要,同时后半段对应前半段的位置为\(k - len\)。(开始写的循环有点问题,后面换成递归解决了)
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
string s;
inline char change(char c)
{
return isupper(c) ? tolower(c) : toupper(c);
}
char f(int k, bool flag)
{
int len = s.size();
if (k < len)
{
return flag ? change(s[k]) : s[k];
}
while (k >= (len << 1))
{
len <<= 1;
}
return f(k - len, !flag);
}
void solve()
{
int q;
cin >> s >> q;
while (q--)
{
int k;
cin >> k;
k--;
putchar(f(k, false));
putchar(' ');
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
//cin >> T;
while (T--)
{
solve();
}
return 0;
}
E -
题意
思路
代码
点击查看代码