Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int a=9<<9e9;
- #include<iostream>
- using namespace std;
- class S
- {
- public:
- virtual bool next()=0;
- virtual S *dup()=0;
- virtual S *max()=0;
- virtual void dump()=0;
- };
- int length(S **list)
- {
- if(!list)
- {
- return 0;
- }
- int i;
- for(i=0;list[i]!=0;++i);
- return i;
- }
- class S0 : public S
- {
- public:
- int i;
- virtual bool next(){return --i>0;}
- virtual S *dup()
- {
- S0 *s=new S0();
- s->i=i;
- return (S*)s;
- }
- virtual S *max()
- {
- S0 *s=new S0();
- s->i=a;
- return (S*) s;
- }
- virtual void dump()
- {
- cout<<i;
- }
- };
- class S1 : public S
- {
- public:
- S *value;
- S *rank;
- S** list;
- virtual bool next()
- {
- if(!list)
- {
- return value->next();
- }
- int i;
- for(i=0;list[i] && !list[i]->next();++i)
- {
- list[i]=list[i]->max();
- }
- if(list[i]==0)
- {
- return value->next();
- }
- return true;
- }
- virtual S *dup()
- {
- S1 *s=new S1();
- s->value=value->dup();
- s->rank=rank->dup();
- s->list=0;
- if(list)
- {
- int l=length(list);
- s->list=new S *[l+1];
- for(int i=0;i<l;++i)
- {
- s->list[i]=list[i]->dup();
- }
- s->list[l]=0;
- }
- return (S *)s;
- }
- virtual S *max()
- {
- S1 *s=new S1();
- s->value=value->max();
- s->rank=rank->dup();
- s->list=new S *[a+1];
- for(int i=0;i<a;++i)
- {
- s->list[i]=list[i]->max();
- }
- s->list[a]=0;
- return (S *)s;
- }
- virtual void dump()
- {
- cout<<"$(";
- value->dump();
- cout<<")";
- cout<<"<";
- rank->dump();
- cout<<">";
- if(list)
- {
- cout<<"[";
- for(int i=0;list[i]!=0;i++)
- {
- list[i]->dump();
- cout<<",";
- }
- cout<<"]";
- }
- }
- };
- S *generate(S *x,S *rank)
- {
- S1 *s=new S1();
- s->value=x->dup();
- s->rank=rank->dup();
- S *r=rank->dup();
- bool n=r->next();
- if(!n)
- {
- s->list=0;
- }
- else
- {
- s->list=new S *[a+1];
- for(int i=0;i<a;++i)
- {
- s->list[i]=generate(x,r);
- }
- s->list[a]=0;
- }
- return s;
- }
- S *generate2()
- {
- S0 s0;
- S *s=generate(s0.max(),s0.max());
- for(int i=0;i<a;i++)
- {
- s=generate(s->max(),s->max());
- }
- return s;
- }
- void f(S *s)
- {
- a<<=a<<a;
- if(!s->next())
- {
- return;
- }
- S *m=generate2();
- while(m->next())
- {
- f(s->dup());
- }
- }
- int main()
- {
- f(generate2());
- return a;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement