QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#290213#7967. 二进制daydream#ML 0ms3624kbC++201.8kb2023-12-24 16:11:322023-12-24 16:11:33

Judging History

你现在查看的是最新测评结果

  • [2023-12-24 16:11:33]
  • 评测
  • 测评结果:ML
  • 用时:0ms
  • 内存:3624kb
  • [2023-12-24 16:11:32]
  • 提交

answer

#include<bits/stdc++.h>
#define db double
#define LL long long
#define pb push_back
#define eb emplace_back
#define pli pair<LL,int>
#define pii pair<int,int>
#define fr first
#define sc second
#define mp make_pair
using namespace std;
const int dx[]={0,1,0,-1,1,1,-1,-1},
		  dy[]={1,0,-1,0,1,-1,1,-1};

struct BIT
{
	int n;
	vector<int> tr;
	BIT(int N)
	{
		tr.resize((n=N)+10);
	}
	void upd(int i) {for(;i<=n;i+=(i&-i)) tr[i]++;}
	int qry(int i) {int res=0; for(;i;i-=(i&-i)) res+=tr[i]; return res;}
};
int n;
void solve()
{
	cin>>n;
	string s;cin>>s;s=" "+s;
	vector<int> a(n+10),f(n+10),ex(n+10,1),nxt(n+10),pre(n+10),cnt(n*2+10);
	vector<set<int>> pos(n*2+10);
	nxt[n+1]=n+1;
	for(int i=1;i<=n;++i) a[i]=s[i]-'0',nxt[i]=i+1,pre[i]=i-1;
	BIT T(n);
	for(int k=1,x=1;x<=n;++k,x<<=1)
	{
		for(int i=1;i<=n;++i)
			if(ex[i])
			{
				f[i]=0;
				for(int p=i,j=1;j<=k&&p<=n;++j,p=nxt[p]) f[i]=f[i]<<1|a[p];
				cnt[f[i]]++;pos[f[i]].insert(i);
//				cout<<a[i];
			}
//		cout<<'\n';
		int S=(1<<k)-1;
		for(int i=x;i<=n&&i<(x<<1);++i)
		{
//			cout<<cnt[7]<<'\n';
			if(!cnt[i])
			{
				cout<<"-1 0\n";
				continue;
			}
			int P=*pos[i].begin(),p=P;
			cout<<p-T.qry(p)<<' '<<cnt[i]<<'\n';
			for(int j=1;j<=k;++j,p=nxt[p])
			{
				ex[p]=0;
				T.upd(p);
				cnt[f[p]]--;
				pos[f[p]].erase(p);
			}
			nxt[pre[P]]=p;pre[p]=pre[P];
			p=P;
			for(int j=1;j<k;++j) p=pre[p];
			if(!p) p=nxt[p];
			int x=0,ps=p;
			for(int j=1;j<k;++j,ps=nxt[ps]) x=x<<1|a[ps];
			for(int j=1;j<k;++j,p=nxt[p],ps=nxt[ps])
			{
				cnt[f[p]]--;pos[f[p]].erase(p);
				if(ps<=n)
				{
					x=((x<<1)&S)|a[ps];
					f[p]=x;
					cnt[f[p]]++;pos[f[p]].insert(p);
				}
			}
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int TT=1;
//	cin>>TT;
	for(;TT;--TT) solve();
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3624kb

input:

20
01001101101101110010

output:

2 11
5 5
4 5
11 1
4 2
7 1
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0

result:

ok 20 lines

Test #2:

score: -100
Memory Limit Exceeded

input:

1000000
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111...

output:

1 1000000
-1 0
1 999998
-1 0
-1 0
-1 0
1 999995
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
1 999991
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
1 999986
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0
-1 0...

result: