【CF】Codeforces Round #545 (Div. 2)
菜是原罪(暂待填坑)
A
水题#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int a[100005],lx[100005];
int ans;
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
if(a[i]==a[i-1]) lx[i]=lx[i-1]+1;
else lx[i] = 1;
int o = i-lx[i];
if(a[o]!=a[i]&&lx[o]>=lx[i]) ans = max(lx[i]*2,ans);
}
printf("%d",ans);
}
B
构造#include<stdio.h>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
int ac[5005];
char sA[5005],sB[5005];
int n,le;
int A,B,C,D;
int a,b,c,d;
bool mk[5005];
int main() {
scanf("%d%s%s",&n,&sA[1],&sB[1]);
for(int i=1;i<=n;i++) {
if(sA[i]=='1'&&sB[i]=='0') a++,ac[i]=1;
if(sA[i]=='0'&&sB[i]=='1') b++,ac[i]=2;
if(sA[i]=='1'&&sB[i]=='1') c++,ac[i]=3;
if(sA[i]=='0'&&sB[i]=='0') d++,ac[i]=4;
}
A = -1; le = (n>>1);
for(int i=0;i<=le;i++) {
for(int j=0;j<=i&&j<=a;j++) {
int a1 = j;
int c1 = i-j;
int b1 = b-(i-(c-c1));
int d1 = le-a1-b1-c1;
if(a1<0||c1<0||b1<0||d1<0||a1>a||b1>b||c1>c||d1>d) continue;
A = a1; B = b1; C = c1; D = d1;
break;
}
}
if(A==-1) {
puts("-1"); return 0;
}
for(int i=1;i<=n;i++) {
if(ac[i]==1&&A) {
A--; mk[i] = 1;
}
if(ac[i]==2&&B) {
B--; mk[i] = 1;
}
if(ac[i]==3&&C) {
C--; mk[i] = 1;
}
if(ac[i]==4&&D) {
D--; mk[i] = 1;
}
if(mk[i]) printf("%d ",i);
}
}
C
直接sort之后,对于一个交叉路口答案就是max(行中比自己小的,列中比自己小的) + max(行中比自己大的,列中比自己大的)+1#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 5e4+5;
int n,m;
int a[1005][1005];
int sta[1005];
int miwh[1005][1005],mxwh[1005][1005];
int miwl[1005][1005],mxwl[1005][1005];
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
}
int tp = 0;
for(int i=1;i<=n;i++) {
tp = 0;
for(int j=1;j<=m;j++) sta[++tp] = a[i][j];
sort(sta+1,sta+1+tp);
tp = unique(sta+1,sta+1+tp)-sta-1;
for(int j=1;j<=m;j++) {
miwh[i][j] = lower_bound(sta+1,sta+1+tp,a[i][j])-sta;
mxwh[i][j] = tp - miwh[i][j];
}
}
for(int i=1;i<=m;i++) {
tp = 0;
for(int j=1;j<=n;j++) sta[++tp] = a[j][i];
sort(sta+1,sta+1+tp);
tp = unique(sta+1,sta+1+tp)-sta-1;
for(int j=1;j<=n;j++) {
miwl[j][i] = lower_bound(sta+1,sta+1+tp,a[j][i])-sta;
mxwl[j][i] = tp - miwl[j][i];
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
printf("%d ",max(miwh[i][j],miwl[i][j]) + max(mxwh[i][j],mxwl[i][j]));
}
puts("");
}
}
D
KMP#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 5e5+5;
char s[maxn],t[maxn];
int fail[maxn];
int c1,c0,len1,len2;
int main() {
int j = 0;
scanf("%s%s",&s[1],&t[1]);
len1 = strlen(s+1); len2 = strlen(t+1);
for(int i=1;i<=len1;i++) {
if(s[i]=='0') c0++;
else c1++;
}
for(int i=2;i<=len2;i++) {
while(j&&t[j+1]!=t[i]) j = fail[j];
if(t[j+1]==t[i]) j++;
fail[i] = j;
}
j = 0;
for(int i=1;i<=len1;i++) {
if(t[j+1]=='0') {
if(c0) printf("%c",t[j+1]),c0--;
else break;
} else {
if(c1) printf("%c",t[j+1]),c1--;
else break;
}
j++; if(j==len2) j = fail[len2];
}
while(c0) putchar('0'),c0--;
while(c1) putchar('1'),c1--;
}