https://atcoder.jp/contests/abc337/tasks/abc337_d
题意:给你一个高为n,宽为m,由('.','x','o')组成的二位图
你可以进行操作:将'.'转化为'o'
问至少操作几次,可以有一个长为k,宽为1,由'o'组成的长条
我们可以利用前缀和之差去计算从该点到前k个三种符号各有几个
因为题目给出n*m<=2e5,所以只能进行一维的操作
因为形成的图形可以竖直也可以横放,所以需要将原先的图形旋转,得到一个新的图形
让ans=k+1,当你查找完发现ans不变的话就说明无论怎么操作都不可行
const int N=2e5+10;
string a[N],b[N];
struct demo{
int b,c;
}q[N];
int n,m,k;
void solve(){
cin >> n >> m >> k;
for(int i=1;i<=n;i++){
string s;
cin >> s;
s=" "+s;
a[i]=s;
}
for(int i=1;i<=m;i++){
b[i]+=" ";
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
b[j]+=a[i][j];
}
}
int ans=k+1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
q[j].c=q[j].b=0;
}
for(int j=1;j<=m;j++){
if(a[i][j]=='x'){
q[j]={0,0};
}else if(a[i][j]=='.'){
q[j]=q[j-1];
q[j].c++;
q[j].b++;
}else{
q[j]=q[j-1];
q[j].c++;
}
if(q[j].c>=k){
int ss=q[j].b-q[j-k].b;
ans=min(ans,ss);
}
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
q[j].c=q[j].b=0;
}
for(int j=1;j<=n;j++){
if(b[i][j]=='x'){
q[j]={0,0};
}else if(b[i][j]=='.'){
q[j]=q[j-1];
q[j].c++;
q[j].b++;
}else{
q[j]=q[j-1];
q[j].c++;
}
if(q[j].c>=k){
int ss=q[j].b-q[j-k].b;
ans=min(ans,ss);
}
}
}
if(ans==k+1){
cout << -1;
}else{
cout << ans;
}
}