rt,H,输出完就RE了,不知道为什么,痛失AC/fn/fn/fn
#include <bits/stdc++.h>
using namespace std;
int num[2000005];
int val[2000005];
int ans[2000005],id[2000005];
int nowid[2000005];
int tree[2000005];
int numid[2000005];
int tmp1[2000005];
bool flag[2000005];
bool del[2000005];
bool tag[2000005];
string s,s1,s2;
int n,i,j,k,m;
queue<int> q1,q2;
deque<int> q;
int lowbit(int x){
return x & -x;
}
int query(int x){
int sum=0;
while(x){
sum+=tree[x];
x-=lowbit(x);
}
return sum;
}
void insert(int x){
while(x<=n){
tree[x]++;
x+=lowbit(x);
}
}
int main() {
cin>>n;
cin>>s;
s=" "+s;
memset(tag,false,sizeof(tag));
for(i=n+1;i<=1000000;i++)
tag[i]=true;
tag[0]=true;
for(i=0;1<<(i)<=n;i++){
while(!q1.empty()) q1.pop();
while(!q2.empty()) q2.pop();
memset(tree,0,sizeof(tree));
memset(tmp1,0,sizeof(tmp1));
if(i>0){
for(j=(1<<(i-1))+1;j<(1<<i);j++)
tag[j]=true;
}
int len=s.length()-1;
/*for(j=0;j<=len;j++)
printf("%c",s[j]);
printf("\n");*/
int cnt=0;
val[len+1]=0;
for(j=len;j>=1;j--)
val[j]=(val[j+1]>>1)|((s[j]-'0')<<i);
/*printf("%d ",len);
for(j=1;j<=len;j++)
printf("%d ",val[j]);
printf("\n");*/
int now=1;
int minx=0x7fffffff;
s1=" ";
for(j=1;j<=i;j++){
if(tag[val[j]]==false){
if(!q.empty() && val[q.back()]>val[j]) q.pop_back();
q.push_back(j);
}
s1[++cnt]=s[j];
numid[cnt]=j;
}
int nowtag=i+1;
while(nowtag<=len){
while(!q1.empty() && q1.front()<=nowtag){
q1.pop();
insert(q2.front());
q2.pop();
}
if(tag[val[nowtag]]==false){
while(!q.empty() && val[q.back()]>val[nowtag]) q.pop_back();
q.push_back(nowtag);
}
s1[++cnt]=s[nowtag];
numid[cnt]=nowtag;
while(!q.empty() && q.front()==numid[now]) q.pop_front();
nowtag++;
//printf("%d %d %d ",now,val[numid[now]],nowtag);
//if(!q.empty()) printf("%d %d %d\n",nowtag,val[numid[now]],val[q.front()]);
if(s1[now]=='0'){
now++;
continue;
}
if(q.empty() || val[q.front()]>=val[numid[now]]) ans[val[numid[now]]]++;
if(tag[val[numid[now]]]==false){
if(q.empty() || val[q.front()]>=val[numid[now]]){
//printf("%d %d %d ",val[numid[now]],cnt,nowtag);
tag[val[numid[now]]]=true;
id[val[numid[now]]]=nowtag-i-query(val[numid[now]])*(i+1)-1;
while(!q.empty()){
if(val[q.front()]==val[numid[now]]) ans[val[numid[now]]]++;
q.pop_front();
}
q1.push(numid[now]);q2.push(val[numid[now]]);
for(j=1;j<=i;j++)
del[nowid[numid[j]]]=true;
cnt=max(cnt-i-1,0);
//printf("%d ",now);
val[numid[cnt]]=(val[nowtag]>>1)|((s[numid[cnt]]-'0')<<i);
//printf("fuckccf");
for(j=cnt-1;j>=max(1,cnt-i);j--)
val[numid[j]]=(val[numid[j+1]]>>1)|((s[numid[j]]-'0')<<i);
for(j=now-i+1;j<now;j++){
if(tag[val[numid[j]]]==false){
while(!q.empty() && val[q.back()]>val[numid[j]]) q.pop_back();
q.push_back(numid[j]);
}
}
now=max(now-i,0);
}
else now++;
}
else now++;
}
//printf("%d ",cnt);
s="";
for(j=0;j<=cnt;j++)
s+=s1[j];
//for(j=0;j<=cnt;j++)
//printf("%d ",s1[j]);
//printf("\n");
}
//cout<<id[20]<<"\n";
for(i=1;i<=n;i++){
if(id[i]==0) printf("0 -1\n");
else printf("%d %d\n",id[i],ans[i]);
//printf("%d ",i);
}
return 0;
}