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 -
题意
思路
代码
点击查看代码