Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<set>
- #include<map>
- #include<queue>
- #include<cassert>
- #define PB push_back
- #define MP make_pair
- #define sz(v) (in((v).size()))
- #define forn(i,n) for(in i=0;i<(n);++i)
- #define forv(i,v) forn(i,sz(v))
- #define fors(i,s) for(auto i=(s).begin();i!=(s).end();++i)
- #define all(v) (v).begin(),(v).end()
- using namespace std;
- typedef long long in;
- typedef vector<in> VI;
- typedef vector<VI> VVI;
- VI opr;
- VVI nbs;
- VI undl,undr;
- void mkclr(){
- opr.clear();
- in u=0;
- in prv=-1;
- do{
- opr.PB(u);
- forv(i,nbs[u]){
- if(nbs[u][i]!=prv){
- prv=u;
- u=nbs[u][i];
- break;
- }
- }
- }while(u!=sz(nbs)-1);
- opr.PB(u);
- undl.clear();
- undr.clear();
- }
- const in slm=300;
- in gg(in a){
- for(in i=sz(undl)-1;i>=0;--i){
- if(a>=undl[i] && a<=undr[i])
- a=(undl[i]+undr[i]-a);
- }
- return opr[a];
- }
- in fnb(in a, in b){
- forv(i,nbs[a])
- if(nbs[a][i]==b)
- return i;
- assert(0);
- return 0;
- }
- void doop(in l, in r){
- if(sz(undl)>=slm)
- mkclr();
- in c1=gg(l);
- in c2=gg(l+1);
- in d1=gg(r);
- in d2=gg(r-1);
- in nleft=!fnb(c1,c2);
- in nright=!fnb(d1,d2);
- nbs[nbs[c1][nleft]][fnb(nbs[c1][nleft],c1)]=d1;
- nbs[nbs[d1][nright]][fnb(nbs[d1][nright],d1)]=c1;
- swap(nbs[c1][nleft],nbs[d1][nright]);
- undl.PB(l);
- undr.PB(r);
- }
- string rst;
- VI epr;
- queue<in> tcg;
- VI ts;
- void mkrs(in k){
- forv(i,rst)
- if(rst[i]!='?')
- tcg.push(i);
- while(!tcg.empty()){
- in u=tcg.front();
- tcg.pop();
- if(rst[epr[u]]!=rst[u]){
- if(rst[epr[u]]!='?'){
- cout<<"Bad Luck Allen\n";
- return;
- }
- rst[epr[u]]=rst[u];
- tcg.push(epr[u]);
- }
- }
- const in alsz=26;
- forv(i,rst){
- if(rst[i]!='?')
- continue;
- ts.PB(i);
- rst[i]='x';
- tcg.push(i);
- while(!tcg.empty()){
- in u=tcg.front();
- tcg.pop();
- if(rst[epr[u]]!=rst[u]){
- if(rst[epr[u]]!='?'){
- cout<<"Bad Luck Allen\n";
- return;
- }
- rst[epr[u]]=rst[u];
- tcg.push(epr[u]);
- }
- }
- }
- for(in i=sz(ts)-1;i>=0;--i){
- rst[ts[i]]='a'+(k%alsz);
- k/=alsz;
- tcg.push(ts[i]);
- while(!tcg.empty()){
- in u=tcg.front();
- tcg.pop();
- if(rst[epr[u]]!=rst[u]){
- if(rst[epr[u]]!='x'){
- cout<<"Bad Luck Allen\n";
- return;
- }
- rst[epr[u]]=rst[u];
- tcg.push(epr[u]);
- }
- }
- }
- if(k)
- cout<<"Bad Luck Allen\n";
- else
- cout<<rst<<"\n";
- }
- int main(){
- ios::sync_with_stdio(0);
- cin.tie(0);
- in n,m,k;
- cin>>n>>m>>k;
- opr=VI(n+2);
- forv(i,opr)
- opr[i]=i;
- nbs.resize(n+2);
- nbs[0]={1};
- nbs[n+1]={n};
- for(in i=1;i<=n;i++)
- nbs[i]={i-1,i+1};
- cin>>rst;
- in l,r;
- forn(i,m){
- cin>>l>>r;
- if(l!=r)
- doop(l,r);
- }
- mkclr();
- for(in i=1;i<=n;++i)
- epr.PB(opr[i]-1);
- mkrs(k-1);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment