T1 又是一道暴力,直接预处理再枚举即可 AC代码
#include <bits/stdc++.h>
using namespace std;
int n;
string s1[4], s2[4], s3[4][7], s4[4][7]; // s2[i]是反转 s3[i]后k个 s[i] 前k个
int main() {
freopen("restore.in", "r", stdin);
freopen("restore.out", "w", stdout);
cin >> n;
cin >> s1[1] >> s1[2] >> s1[3];
for (int i = 1; i <= 3; i++) {
for (int j = n - 1; j >= 0; j--) s2[i] += s1[i][j];
}
for (int i = 1; i <= 3; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k <= 6; k++) {
if (s1[i][j] + k > 122)
s3[i][k] += (s1[i][j] + k - 26);
else
s3[i][k] += (s1[i][j] + k);
}
}
}
for (int i = 1; i <= 3; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k <= 6; k++) {
if (s1[i][j] - k < 97)
s4[i][k] += (s1[i][j] - k + 26);
else
s4[i][k] += (s1[i][j] - k);
}
}
}
for (int i = 1; i <= 3; i++) { //反转 s1[i]是s的反转 即s2[i]=s
for (int j = 1; j <= 3; j++) { //后k个 s1[j]是s的后k个 即s4[j][k]=s
for (int r = 1; r <= 3; r++) { //前k个 s1[r]是s的前k个 即s3[r][k]=s
for (int k = 0; k <= 6; k++) {
if (i != j && j != r && i != r && s2[i] == s4[j][k] && s2[i] == s3[r][k]) {
cout << s2[i];
return 0;
}
}
}
}
}
return 0;
}
T2 考试时没想到从后往前遍历 直接暴力拿下60分 (为什么别人暴力都是清一色的30分…) 60分代码
#include <bits/stdc++.h>
using namespace std;
int n, m, q;
long long ans = 0;
int main() {
freopen("board.in", "r", stdin);
freopen("board.out", "w", stdout);
cin >> n >> m >> q;
bool a[n + 2][m + 2] = { 0 };
for (int i1 = 1; i1 <= q; i1++) {
int x, y, z;
cin >> x >> y >> z;
if (x === 0) {
for (int i = 1; i <= m; i++) a[y][i] = z;
}
if (x === 1) {
for (int i = 1; i <= n; i++) a[i][y] = z;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (a[i][j] == 1)
ans++;
}
}
cout << ans;
return 0;
}
AC做法 如果是染行就+m-列的个数,染列就+n-行的个数
#include <bits/stdc++.h>
using namespace std;
long long n,m,q,x[1000001],y[1000001],z[1000001],sum1=0,sum2=0,line1[1000001],line2[1000001];
long long ans=0;
int main() {
freopen("board.in", "r", stdin);
freopen("board.out", "w", stdout);
cin>>n>>m>>q;
for(int i=1;i<=q;i++)cin>>x[i]>>y[i]>>z[i];
for(int i=q;i>=1;i--){
if(x[i]==0){
if(line1[y[i]]==1){
continue;
}
else{
if(z[i]==1){
ans+=m;
ans-=sum1;
}
line1[y[i]]=1;
sum2++;
}
}
else{
if(line2[y[i]]==1){
continue;
}
else{
if(z[i]==1){
ans+=n;
ans-=sum2;
}
line2[y[i]]=1;
sum1++;
}
}
}
cout<<ans;
return 0;
}
T3 数学题简单想一下如果遇到b就++,遇到a后有b就*2
#include <bits/stdc++.h>
using namespace std;
long long ans = 0, mod = 1e9 + 7, b1 = 0, t = 1;
int n, l[1000002], ll = 1;
int main() {
freopen("string.in", "r", stdin);
freopen("string.out", "w", stdout);
string s;
cin >> s;
n = s.size();
for (int i = n - 1; i >= 0; i--) {
if (s[i] == 'b') {
b1++;
}
if (s[i] == 'a' && s[i + 1] == 'b') {
l[ll] = b1 + l[ll - 1];
s[i] = 'b';
b1 = 0;
ll++;
}
}
for (int i = ll - 1; i >= 1; i--) {
t %= mod;
ans += ((t * l[i]) % mod);
ans %= mod;
t *= 2;
}
cout << ans % mod;
return 0;
}