P10040
很暴力的一道题。
你考虑 bitset 维护当前已经确定的答案,发现每次其实就是左移 ? 的答案,直接再看一下左移完
复杂度显然是
但是你可以考虑根号分治,前面 bitset 搞每次次数 bitset,复杂度退化为
const int N=1e5+19;
bitset<N> ans, maybe, now;
signed main() {
int n; string s;
cin >> n >> s;
int sq=sqrt(n);
s=" "+s;
for (int i=1;i<=n;++i) {
if (s[i]=='1') ans[i]=1;
else if (s[i]=='?') maybe[i]=1;
}
for (int i=1;i<=n;++i) {
now=ans;
if (i <= sq) {
for (int j=i+1;j<=n;++j) if (s[j]=='?'&&now[j-i]) now[j]=1;
} else {
for (int j=i;j<=n;j+=i) {
now=now|((now<<i)&maybe);
} }
write(now.count(), '\n');
}
return 0;
}