check可以用差分on解决,为什么要用到线段树或者树状数组,感觉有点误人子弟的感觉。
放个我的代码,具体自己看吧。
#include<bits/stdc++.h>
using namespace std;
int q[5005];
int vis[5005];
void solve() {
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
char x;
cin >> x;
q[i] = x-'0';
}
for (int k = n; k >= 1; k--) {
memset(vis, 0, sizeof(vis));
int now = 0;
int tag = 0;
for (int i = 1; i <= n - k + 1; ++i) {
now = (now + vis[i]) % 2;
int kk = (now + q[i]) % 2;
if (kk == 0) {
now += 1;
vis[i + k] += 1;
}
}
for (int i = n - k + 2; i <= n; ++i) {
now = (now + vis[i]) % 2;
int kk = (now + q[i]) % 2;
if (kk == 0) {
tag = 1;
break;
}
}
if (tag == 0) {
cout << k << endl;
return;
}
}
}
int main(){
int T;
cin >> T;
while (T--) {
solve();
}
}