QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#372576 | #3033. Harry Potter and the Palindromic Radius | SolitaryDream# | 100 ✓ | 5381ms | 49388kb | C++17 | 2.1kb | 2024-03-31 15:50:45 | 2024-03-31 15:50:46 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define FOR(i,s,t) for(int i=(s),_t=(t); i<=_t; ++i)
#define DOR(i,s,t) for(int i=(s),_t=(t); i>=_t; --i)
typedef long long ll;
const int N=1e6+50;
int a[N],b[N];
int Fa[N],dis[N];
int Find(int x) {
if(Fa[x]==x) return x;
Find(Fa[x]);
dis[x]^=dis[Fa[x]];
return Fa[x]=Fa[Fa[x]];
}
int ans[N];
void solve() {
int n;
cin >> n;
FOR(i,1,n) cin >> a[i];
int p=0;
vector<pair<int,int>> f,g;
FOR(i,1,n) {
if(b[p]+p>=i) {
b[i]=min(b[p*2-i],b[p]+p-i);
} else {
b[i]=0;
}
if(i+b[i]>=p+b[p]) {
while(b[i]<a[i] && i+b[i]+1<=n && i-b[i]-1>=1) {
f.push_back({i-b[i]-1,i+b[i]+1});
b[i]++;
}
}
if(b[i]!=a[i]) {
cout << "0\n";
return ;
}
if(i+b[i]+1<=n && i-b[i]-1>=1) {
g.push_back({i-b[i]-1,i+b[i]+1});
}
if(i+b[i]>p+b[p]) p=i;
}
FOR(i,1,n) Fa[i]=i,dis[i]=0;
for(auto [x,y]: f) {
if(Find(x)!=Find(y)) {
if(Find(x)<Find(y)) swap(x,y);
Fa[Find(x)]=Find(y);
}
}
for(auto [x,y]: g) {
if(Find(x)==Find(y)) {
if(dis[x]==dis[y]) {
cout << "0\n";
return ;
}
} else {
if(Find(x)<Find(y)) swap(x,y);
int fx=Find(x),fy=Find(y);
dis[fx]=1^dis[x]^dis[y];
Fa[fx]=fy;
}
}
vector<int> h;
DOR(i,n,1) if(Find(i)==i) h.push_back(i);
assert(h.size()<10);
cout << (1<<h.size()) << '\n';
FOR(o,0,(1<<h.size())-1) {
FOR(i,0,h.size()-1) {
ans[h[i]]=(o>>i)&1;
}
FOR(i,1,n) {
Find(i);
ans[i]=ans[Fa[i]]^dis[i];
cout << ans[i];
}
cout << '\n';
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while(T--) {
solve();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 5381ms
memory: 49388kb
input:
131112 2 0 0 2 0 1 2 0 0 2 1 0 2 0 0 2 0 1 2 0 0 2 0 1 3 0 1 0 3 0 1 1 3 0 0 0 3 0 1 0 3 0 1 0 3 0 2 0 3 0 0 0 3 1 0 0 3 0 0 0 3 1 0 0 3 0 1 0 3 0 2 0 3 0 0 0 3 0 0 1 3 0 1 0 3 0 2 0 4 0 1 1 0 4 0 1 2 0 4 0 0 1 0 4 0 0 1 1 4 0 1 0 0 4 0 1 0 1 4 0 0 0 0 4 0 0 1 0 4 0 0 1 0 4 1 0 1 0 4 0 1 1 0 4 0 1 2...
output:
4 00 01 10 11 0 4 00 01 10 11 0 4 00 01 10 11 0 4 00 01 10 11 0 4 000 010 101 111 0 4 001 011 100 110 4 000 010 101 111 4 000 010 101 111 0 4 001 011 100 110 0 4 001 011 100 110 0 4 000 010 101 111 0 4 001 011 100 110 0 4 000 010 101 111 0 4 0000 0101 1010 1111 0 4 0010 0111 1000 1101 0 4 0001 0100 ...
result:
ok 401208 lines