欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > atcoder abc 359

atcoder abc 359

2024/10/24 5:20:44 来源:https://blog.csdn.net/2201_75845839/article/details/139993883  浏览:    关键词:atcoder abc 359

A  count takahashi

问题:

思路:字符串比较

代码:

#include <bits/stdc++.h>using namespace std;int main() {int n;cin >> n;int ans = 0;for(int i = 1; i <= n; i ++ ) {string s;cin >> s;if(s[0] == 'T') ans ++;}cout << ans;return 0;
}

B couples

问题:

思路:找出所有a[i - 1]与a[i + 1]相等的pair

代码:
 

#include <bits/stdc++.h>using namespace std;int main() {int n;cin >> n;vector<int> a(2 * n + 1);for(int i = 1; i <= 2 * n; i ++ ) cin >> a[i];int pre = a[1];int ans = 0;for(int i = 2; i <= 2 * n - 1; i ++ ) {if(a[i + 1] == pre) ans ++;pre = a[i];}cout << ans;return 0;
}

C tile distance2

问题:

思路:

注意到每次竖直方向上走一个可以在水平方向上多增加一个偏移量,因此只要先解决竖直方向,然后可以得到一个水平方向的最大范围,只要水平坐标在这个范围内就不用计算水平方向上的花费,反之计算差值除2即可。为了简化计算,可以把所有坐标在水平方向上偏移到砖块的左边部分。

代码:

#include <bits/stdc++.h>using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);long long x1, y1, x2, y2;cin >> x1 >> y1 >> x2 >> y2;long long yy = abs(y1 - y2);long long t = min(x1, x2);x1 = max(x1, x2);x2 = t;if((y1 + x1) & 1) x1 --;if((y2 + x2) & 1) x2 --;//long long tmp = x1;x1 -= yy;if(x1 <= x2) cout << yy;else cout << yy + abs(x1 - x2) / 2;return 0;
}

D - Avoid K Palindrome

问题:

思路:
注意到k很小,话不多说,状态压缩。A为1,B为0

很显然只有一维的状态无法构造状态转移方程。再加一维索引dp[i][j]表示以下标i开头的字符串且状态为j的所有good string 的数量

则有dp[i][j] += dp[i - 1][k]

j与k之间又有什么联系呢,让他们错开一位上下摆放,就可以发现除了第一位和最后一位,其他位都是相同的。这时候让j减去最右边的数,并且整体右移一位!!!很重要,就因为这里,我调了一个小时代码。然后再加上str[i - 1]对应的数。

代码:

#include <bits/stdc++.h>using namespace std;const int mod = 998244353;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, k;cin >> n >> k;vector<char> str(n + 1);for(int i = 1; i <= n; i ++ ) cin >> str[i];vector<vector<int>> dp((n + 1), vector<int>(1 << k));for(int j = 0; j <= (1 << k) - 1; j ++ ) {bool flag = true;vector<char> s(k);for(int i = 0; i < k; i ++ ) {if(j >> i & 1) s[i] = 'A';else s[i] = 'B';if(str[i + 1] != '?' && str[i + 1] != s[i]) flag = false;}if(flag) {reverse(s.begin(), s.end());int num = 0;for(int i = 0; i < k; i ++ ) {if(s[i] == 'A') num += (1 << i) * 1;}if(num != j) dp[1][j] = 1;}}for(int i = 2; i <= n - k + 1; i ++ ) {for(int j = 0; j <= (1 << k) - 1; j ++ ) {bool flag = true;vector<char> s(k);for(int u = 0; u < k; u ++ ) {if(j >> u & 1) s[u] = 'A';else s[u] = 'B';if(str[i + u] != '?' && str[i + u] != s[u]) flag = false;}if(flag) {reverse(s.begin(), s.end());int num = 0;for(int u = 0; u < k; u ++ ) {if(s[u] == 'A') num += 1 << u;}if(num != j) {int tmp = j;if(s[0] == 'A') tmp -= 1 << k - 1;tmp <<= 1;//if(j == 14) cout << tmp << " ";if(str[i - 1] != 'A') (dp[i][j] += dp[i - 1][tmp]) %= mod;if(str[i - 1] != 'B') {tmp ++;//if(j == 14 && i == 2) for(auto t: s) cout << t;//if(dp[i - 1][tmp] && i == 2) cout <<j;(dp[i][j] += dp[i - 1][tmp]) %= mod;}}}}}int ans = 0;for(int i = 0; i <= (1 << k) - 1; i ++ ) (ans += dp[n - k + 1][i]) %= mod;cout << ans;return 0;
}

E

F

G

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com