Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define pb push_back
- #define ll long long
- #define ld long double
- #define pb push_back
- #define ff first
- #define ss second
- #define sp fixed<<setprecision
- #define pii pair<int,int>
- #define FAST ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
- #define bp __builtin_popcount
- #define int ll
- using namespace std;
- ll M = (1e9)+7;
- signed main()
- {
- FAST
- int tc=1;
- cin>>tc;
- while(tc--)
- {
- int n,tot=0,len;
- cin>>n;
- pii a[n];
- set<pii> s[31];
- len=n;
- vector<int> ans;
- set<pii> r;
- for(int i=0;i<n;i++)
- {
- cin>>a[i].ff,a[i].ss=i+1;
- if(!a[i].ff)
- {
- len--;
- ans.pb(i+1);
- }
- else
- {
- r.insert(a[i]);
- }
- tot|=a[i].ff;
- int x=a[i].ff;
- for(int j=0;j<31;j++)
- {
- if((1LL<<j) & x)s[j].insert(a[i]);
- }
- }
- int fa=tot;
- fa+=(n-len)*tot;
- for(int i=0;i<len;i++)
- {
- set<pii> nr;
- for(int j=0;j<31;j++)
- {
- if(s[j].size()==1)nr.insert(*s[j].begin());
- }
- pii rem;
- int fl=0;
- for(auto it:r)
- {
- if(nr.find(it)==nr.end()){fl=1;rem=it;break;}
- }
- if(!fl)
- {
- int mi = 1e10;
- for(auto it:nr)
- {
- int num = it.ff,red=0;
- for(int j=0;j<31;j++)
- {
- if(((1LL<<j) & num) && s[j].size()==1)red+=(1LL<<j);
- }
- if(red<mi)
- {
- mi = red;
- rem = it;
- }
- }
- }
- ans.pb(rem.ss);
- r.erase(rem);
- for(int j=0;j<31;j++)
- {
- if(rem.ff & (1LL<<j))
- {
- s[j].erase(s[j].find(rem));
- if(s[j].size()==0)tot^=(1LL<<j);
- }
- }
- fa+=tot;
- }
- cout<<fa<<endl;
- for(int i=0;i<n;i++)cout<<ans[i]<<" ";
- cout<<endl;
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment