Guest User

Untitled

a guest
Sep 23rd, 2015
435
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.83 KB | None | 0 0
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<set>
  5. #include<map>
  6. #include<queue>
  7. #include<cassert>
  8. #define PB push_back
  9. #define MP make_pair
  10. #define sz(v) (in((v).size()))
  11. #define forn(i,n) for(in i=0;i<(n);++i)
  12. #define forv(i,v) forn(i,sz(v))
  13. #define fors(i,s) for(auto i=(s).begin();i!=(s).end();++i)
  14. #define all(v) (v).begin(),(v).end()
  15. using namespace std;
  16. typedef long long in;
  17. typedef vector<in> VI;
  18. typedef vector<VI> VVI;
  19. VI opr;
  20. VVI nbs;
  21. VI undl,undr;
  22. void mkclr(){
  23.   opr.clear();
  24.   in u=0;
  25.   in prv=-1;
  26.   do{
  27.     opr.PB(u);
  28.     forv(i,nbs[u]){
  29.       if(nbs[u][i]!=prv){
  30.     prv=u;
  31.     u=nbs[u][i];
  32.     break;
  33.       }
  34.     }
  35.   }while(u!=sz(nbs)-1);
  36.   opr.PB(u);
  37.   undl.clear();
  38.   undr.clear();
  39. }
  40. const in slm=300;
  41. in gg(in a){
  42.   for(in i=sz(undl)-1;i>=0;--i){
  43.     if(a>=undl[i] && a<=undr[i])
  44.       a=(undl[i]+undr[i]-a);
  45.   }
  46.   return opr[a];
  47. }
  48. in fnb(in a, in b){
  49.   forv(i,nbs[a])
  50.     if(nbs[a][i]==b)
  51.       return i;
  52.   assert(0);
  53.   return 0;
  54. }
  55. void doop(in l, in r){
  56.   if(sz(undl)>=slm)
  57.     mkclr();
  58.   in c1=gg(l);
  59.   in c2=gg(l+1);
  60.   in d1=gg(r);
  61.   in d2=gg(r-1);
  62.   in nleft=!fnb(c1,c2);
  63.   in nright=!fnb(d1,d2);
  64.   nbs[nbs[c1][nleft]][fnb(nbs[c1][nleft],c1)]=d1;
  65.   nbs[nbs[d1][nright]][fnb(nbs[d1][nright],d1)]=c1;
  66.   swap(nbs[c1][nleft],nbs[d1][nright]);
  67.   undl.PB(l);
  68.   undr.PB(r);
  69. }
  70. string rst;
  71. VI epr;
  72. queue<in> tcg;
  73. VI ts;
  74. void mkrs(in k){
  75.   forv(i,rst)
  76.     if(rst[i]!='?')
  77.       tcg.push(i);
  78.   while(!tcg.empty()){
  79.     in u=tcg.front();
  80.     tcg.pop();
  81.     if(rst[epr[u]]!=rst[u]){
  82.       if(rst[epr[u]]!='?'){
  83.     cout<<"Bad Luck Allen\n";
  84.     return;
  85.       }
  86.       rst[epr[u]]=rst[u];
  87.       tcg.push(epr[u]);
  88.     }
  89.   }
  90.   const in alsz=26;
  91.   forv(i,rst){
  92.     if(rst[i]!='?')
  93.       continue;
  94.     ts.PB(i);
  95.     rst[i]='x';
  96.     tcg.push(i);
  97.     while(!tcg.empty()){
  98.       in u=tcg.front();
  99.       tcg.pop();
  100.       if(rst[epr[u]]!=rst[u]){
  101.     if(rst[epr[u]]!='?'){
  102.       cout<<"Bad Luck Allen\n";
  103.       return;
  104.     }
  105.     rst[epr[u]]=rst[u];
  106.     tcg.push(epr[u]);
  107.       }
  108.     }
  109.   }
  110.   for(in i=sz(ts)-1;i>=0;--i){
  111.     rst[ts[i]]='a'+(k%alsz);
  112.     k/=alsz;
  113.     tcg.push(ts[i]);
  114.     while(!tcg.empty()){
  115.       in u=tcg.front();
  116.       tcg.pop();
  117.       if(rst[epr[u]]!=rst[u]){
  118.     if(rst[epr[u]]!='x'){
  119.       cout<<"Bad Luck Allen\n";
  120.       return;
  121.     }
  122.     rst[epr[u]]=rst[u];
  123.     tcg.push(epr[u]);
  124.       }
  125.     }
  126.   }
  127.   if(k)
  128.     cout<<"Bad Luck Allen\n";
  129.   else
  130.     cout<<rst<<"\n";
  131. }
  132. int main(){
  133.   ios::sync_with_stdio(0);
  134.   cin.tie(0);
  135.   in n,m,k;
  136.   cin>>n>>m>>k;
  137.   opr=VI(n+2);
  138.   forv(i,opr)
  139.     opr[i]=i;
  140.   nbs.resize(n+2);
  141.   nbs[0]={1};
  142.   nbs[n+1]={n};
  143.   for(in i=1;i<=n;i++)
  144.     nbs[i]={i-1,i+1};
  145.   cin>>rst;
  146.   in l,r;
  147.   forn(i,m){
  148.     cin>>l>>r;
  149.     if(l!=r)
  150.       doop(l,r);
  151.   }
  152.   mkclr();
  153.   for(in i=1;i<=n;++i)
  154.     epr.PB(opr[i]-1);
  155.   mkrs(k-1);
  156.   return 0;
  157. }
Advertisement
Add Comment
Please, Sign In to add comment