好行:该行至少有一个好人,好列:该列至少有一个好人
求前i个人就坐时,好行和好列个数之和(i = 1, 2, ..., n * m)
思路:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define lson p << 1
#define rson p << 1 | 1
const int maxn = 1e6 + 5, inf = 1e9 + 5, maxm = 4e4 + 5, mod = 1e9 + 7, N = 1e6;
int a[maxn], p[maxn];
int n, m;
string s;
int row[maxn];
bool col[maxn];
int qpow(int a, int b){
int res = 1;
while(b){
if(b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
int __lcm(int a, int b){
int g = __gcd(a, b);
return a * b / g;
}
void solve(){
int res = 0;
cin >> n >> m;
for(int i = 0; i <= n * m; i++){
row[i] = 0;//row[i]表示第i位同学坐在(1,1)时,好行的个数
}
for(int i = 0; i <= m; i++){
col[i] = 0;//col[i]表示第i行是不是好列
}
int cnt_c = 0;
cin >> s;
int last = -inf;
for(int i = 0; i < n * m; i++){
if(s[i] == '1'){
if(!col[i % m]){
col[i % m] = 1;//编号%m相等的人会在同一列
cnt_c++;
}
last = i;
}
if(i - m >= 0) row[i] = row[i - m];
if(i - last < m){
row[i]++;
}
// cout << i << ' ' << cnt_c << ' ' << row[i] << '\n';
cout << cnt_c + row[i] << " \n"[i == n * m - 1];
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
// fac[0] = 1;
// for(int i = 1; i <= N; i++){
// fac[i] = fac[i - 1] * i % mod;
// }
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}