• UOJ #270【清华集训2016】工厂


    Description

    这是一道提交答案题

    跳蚤国作为一个发展中国家,生产力始终比发达国家跳晚国差一大截,因此发展生产力一直是跳蚤国第一重要的事。

    近日,跳蚤国王在视察跳蚤国首都的X工厂时,发现这里的机器效率低下,而且污染严重,以至于跳蚤国首都几乎每天都是漫天雾霾……

    X工厂是用来检验各地运来的产品的质量的。在X工厂的每个车间中,有若干个节点。每个节点有一台机器,这台机器对产品进行一些处理后,将其送给下一个节点。

    跳蚤国王回忆起几个月前造计算机的经历,想到了一个绝佳的主意:使用高效、清洁的生物资源!于是在每个节点上,机器被换成了跳蚤。

    具体来说:

    对于X工厂的每个车间,我们可以将所有节点从 $1$ 开始编号。
    对于每个产品,都有一个只由可见字符(即ASCII码在[32,126]区间内的字符)构成的字符串,作为其标识串。 在一开始的时候,产品被送到了第 $1$ 个节点上,然后这些节点需要检查该产品的标识串,最终接受(Accept)或拒绝(Reject)该产品。
    对于不同的车间,需要接受的产品的标识串集合是不同的。

    对于某个节点上的跳蚤,有trans和next两个属性。其中trans为一个大小为$128$的整数数组,next为一个整数。 当一个产品被送到这个节点上时,该产品的标识串的第一个字符将被移除,设其ASCII码为$x$, 则该产品在下一秒会被送到编号为trans[x]的节点上。 如果该产品的标识串已经是空串,则该产品下一秒会被送到编号为next的节点上。

    蛐蛐国王对此表示十分支持,他派来了一些蛐蛐,来增加X工厂的处理能力。也就是说,一个节点上的跳蚤可以被替换成蛐蛐。

    每只蛐蛐有x和next两个整数属性。其中x的范围是[0,127]。

    当一个产品被送到这个蛐蛐节点上时,该产品的标识串的最后会被添加一个ASCII码为x的字符,然后该产品下一秒会被送到编号为next的节点上。
    另外,对于任意一只跳蚤的trans或next,以及对于任意一只蛐蛐的next,其值可以等于0或者-1,其中0表示下一秒接受该产品,-1表示下一秒拒绝该产品。

    由于跳蚤国资源的限制,一个车间最多能有300个节点。在处理一个产品的时候,最多只能花费 $10^6$ 秒的时间。

    跳蚤国王发现自己没有足够的能力来管理这么多跳蚤和蛐蛐,于是找到了参加清华集训的你。请你对X工厂的每个车间,确定需要使用的节点数 $n$,以及每个节点使用的跳蚤或蛐蛐的属性。每个车间作为一个任务,要求如下:

    Solution

    任务一:使用两个节点代表1和0模拟

    任务二:模拟KMP的过程

    任务三:节点$i$表示当前左括号比右括号多$i$个,合法的序列要求任何时刻$i geq 0$且最终$i=0$

    任务四:当连续的左括号到达一定数量,将其简写,如果这段连续的序列是以左括号开头,将其简写为 ( ;如果这段连续的序列是以右括号开头,将其简写为 )(( ;连续的右括号到达一定数量,简写为 ) 

    任务五:用三个点表示当前前缀模3余0,1,2,对下一个字符是0或1分类讨论

    任务六:将ba替换为b,b替换为a,可以将一个斐波那契串改写为上一个斐波那契串

    任务七:同任务六

    任务八:0和1等价,先判断字符串去掉所有括号是否值和符号交替出现,再判断括号是否匹配

    任务九:同任务八

    任务十:每次将一个iaea换成a,判断最后是否为a

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int kind[305];
    char str[150]="aaaaaaaaaaaabaaaaaabaaaaaaaaaaaaaabaaabaaabaaaaaaaaaabaaaaaaaaabaabaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaorz";
    struct A{
        int ch[130],nxt;
        A(int x=0,int y=0){
            for(int i=0;i<128;i++)ch[i]=x;
            nxt=y;
        }
        void print(){
            printf("1 ");
            for(int i=0;i<128;i++)printf("%d ",ch[i]);
            printf("%d
    ",nxt);
        }
    }a[100005];
    struct B{
        int ch,nxt;
        B(int x=0,int y=0){ch=x,nxt=y;}
        void print(){printf("2 %d %d
    ",ch,nxt);}
    }b[100005];
    inline int read(){
        int f=1,w=0;
        char ch=0;
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')w=(w<<1)+(w<<3)+ch-'0',ch=getchar();
        return f*w;
    }
    namespace task1{
        void solve(){freopen("1.out","w",stdout),a[1]=A(-1,-1),a[2]=A(-1,0),a[1].ch['0']=1,a[1].ch['1']=2,a[2].ch['0']=1,a[2].ch['1']=2,puts("2"),a[1].print(),a[2].print();}
    }
    namespace task2{
        int nex[150],n=103;
        void getNext(){
            nex[0]=-1;
            int i=0,j=-1;
            while(i<n)
                if(j==-1||str[i]==str[j])++i,++j,nex[i]=j;
                else j=nex[j];
        }
        void solve(){
            freopen("2.out","w",stdout),getNext();
            for(int i=0;i<n;i++){
                a[i+1]=A(-1,-1);
                for(int id=32;id<=126;id++){
                    int j=i;
                    while(j!=-1&&str[j]!=id)j=nex[j];
                    a[i+1].ch[id]=j+2;
                }
            }
            a[103].ch[str[102]]=0,puts("103");
            for(int i=1;i<=103;i++)a[i].print();
        }
    }
    namespace task3{
        void solve(){
            freopen("3.out","w",stdout);
            for(int i=0;i<=50;i++){
                a[i]=A(-1,-1);
                if(i<50)a[i].ch['(']=i+2;
                if(i)a[i].ch[')']=i;
            }
            a[0].nxt=0,puts("51");
            for(int i=0;i<=50;i++)a[i].print();
        }
    }
    namespace task4{
        int lim=90,p1=3,p2=1,ans;
        void solve(){
            freopen("4.out","w",stdout),kind[1]=2,b[1]=B(0,2),kind[2]=1,a[1]=A(-1,-1),a[1].ch[0]=0,a[1].ch['(']=5,kind[3]=1,a[2]=A(-1,-1),a[2].ch[0]=1,a[2].ch['(']=5,a[2].ch[')']=4,kind[4]=1,a[3]=A(-1,-1);
            for(int i=1;i<=lim;i++){
                kind[p1+p2+1]=1,a[++p1]=A(-1,-1),a[p1].ch['(']=p1+p2+1;
                if(i!=1)a[p1].ch[')']=p1+p2-1;
                else a[p1].ch[')']=3;
            }
            kind[p1+p2+1]=2,b[++p2]=B('(',3),a[3].ch['(']=p1+p2+1;
            for(int i=1;i<=lim+1;i++){
                kind[p1+p2+1]=1,a[++p1]=A(-1,-1),a[p1].ch['(']=p1+p2+1;
                if(i!=1)a[p1].ch[')']=p1+p2-1;
                else a[p1].ch[')']=4;
            }
            kind[p1+p2+1]=2,b[++p2]=B(')',p1+p2+1),kind[p1+p2+1]=2,b[++p2]=B('(',p1+p2+1),kind[p1+p2+1]=2,b[++p2]=B('(',3);
            a[3].ch[')']=p1+p2+1;
            for(int i=1;i<lim;i++){
                kind[p1+p2+1]=1,a[++p1]=A(-1,-1),a[p1].ch[')']=p1+p2+1;
                if(i!=1)a[p1].ch['(']=p1+p2-1;
                else a[p1].ch['(']=4;
            }
            kind[p1+p2+1]=2,b[++p2]=B(')',3),printf("%d
    ",ans=p1+p2),p1=p2=0;
            for(int i=1;i<=ans;i++)kind[i]==1?a[++p1].print():b[++p2].print();
        }
    }
    namespace task5{
        void solve(){freopen("5.out","w",stdout),a[1]=A(-1,0),a[2]=a[3]=A(-1,-1),a[1].ch['0']=1,a[1].ch['1']=2,a[2].ch['0']=3,a[2].ch['1']=1,a[3].ch['0']=2,a[3].ch['1']=3,puts("3"),a[1].print(),a[2].print(),a[3].print();}
    }
    namespace task6{
        int p1,p2;
        void solve(){
            freopen("6.out","w",stdout),kind[1]=2,b[1]=B(0,2),kind[2]=1,a[1]=A(-1,-1),a[1].ch['a']=3,a[1].ch['b']=5,kind[3]=1,a[2]=A(-1,-1),a[2].ch[0]=0,kind[4]=2,b[2]=B('a',1),kind[5]=1,a[3]=A(-1,-1),a[3].ch[0]=4,a[3].ch['a']=6,a[3].ch['b']=7,kind[6]=2,b[3]=B('b',8),kind[7]=2,b[4]=B('a',5),kind[8]=1,a[4]=A(-1,-1),a[4].ch[0]=1,a[4].ch['b']=5,puts("8");
            for(int i=1;i<=8;i++)kind[i]==1?a[++p1].print():b[++p2].print();
        }
    }
    namespace task7{
        int p1,p2;
        void solve(){
            freopen("7.out","w",stdout),kind[1]=2,b[1]=B(0,2),kind[2]=1,a[1]=A(-1,-1),a[1].ch['a']=3,a[1].ch['b']=5,kind[3]=1,a[2]=A(-1,-1),a[2].ch[0]=0,kind[4]=2,b[2]=B('a',1),kind[5]=1,a[3]=A(-1,-1),a[3].ch[0]=4,a[3].ch['a']=6,a[3].ch['b']=7,kind[6]=2,b[3]=B('b',8),kind[7]=2,b[4]=B('a',5),kind[8]=1,a[4]=A(-1,-1),a[4].ch[0]=1,a[4].ch['b']=5,puts("8");
            for(int i=1;i<=8;i++)kind[i]==1?a[++p1].print():b[++p2].print();
        }
    }
    namespace task8{
        int p1,p2;
        void solve(){
            freopen("8.out","w",stdout),kind[1]=2,b[1]=B(0,3),kind[2]=2,b[2]=B('(',3),kind[3]=1,a[1]=A(-1,-1),a[1].ch['0']=a[1].ch['1']=4,a[1].ch['(']=2,kind[4]=1,a[2]=A(-1,-1),a[2].ch[0]=6,a[2].ch['+']=a[2].ch['*']=3,a[2].ch[')']=5,kind[5]=2,b[3]=B(')',4),kind[6]=2,b[4]=B(0,7),kind[7]=1,a[3]=A(-1,-1),a[3].ch[0]=0,a[3].ch['(']=9,kind[8]=1,a[4]=A(-1,-1),a[4].ch[0]=6,a[4].ch['(']=9,a[4].ch[')']=11,kind[9]=1,a[5]=A(-1,-1),a[5].ch['(']=10,a[5].ch[')']=8,kind[10]=2,b[5]=B('(',8),kind[11]=1,a[6]=A(-1,-1),a[6].ch['(']=13,a[6].ch[')']=12,kind[12]=2,b[6]=B(')',8),kind[13]=1,a[7]=A(-1,-1),a[7].ch['(']=14,a[7].ch[')']=11,kind[14]=1,a[8]=A(-1,-1),a[8].ch['(']=15,a[8].ch[')']=13,kind[15]=2,b[7]=B(')',16),kind[16]=2,b[8]=B('(',17),kind[17]=2,b[9]=B('(',8),puts("17");
            for(int i=1;i<=17;i++)kind[i]==1?a[++p1].print():b[++p2].print();
        }
    }
    namespace task9{
        int p1,p2;
        void solve(){
            freopen("9.out","w",stdout),kind[1]=2,b[1]=B(0,3),kind[2]=2,b[2]=B('(',3),kind[3]=1,a[1]=A(-1,-1),a[1].ch['0']=a[1].ch['1']=4,a[1].ch['(']=2,kind[4]=1,a[2]=A(-1,-1),a[2].ch[0]=6,a[2].ch['+']=a[2].ch['*']=3,a[2].ch[')']=5,kind[5]=2,b[3]=B(')',4),kind[6]=2,b[4]=B(0,7),kind[7]=1,a[3]=A(-1,-1),a[3].ch[0]=0,a[3].ch['(']=9,kind[8]=1,a[4]=A(-1,-1),a[4].ch[0]=6,a[4].ch['(']=9,a[4].ch[')']=11,kind[9]=1,a[5]=A(-1,-1),a[5].ch['(']=10,a[5].ch[')']=8,kind[10]=2,b[5]=B('(',8),kind[11]=1,a[6]=A(-1,-1),a[6].ch['(']=13,a[6].ch[')']=12,kind[12]=2,b[6]=B(')',8),kind[13]=1,a[7]=A(-1,-1),a[7].ch['(']=14,a[7].ch[')']=11,kind[14]=1,a[8]=A(-1,-1),a[8].ch['(']=15,a[8].ch[')']=13,kind[15]=2,b[7]=B(')',16),kind[16]=2,b[8]=B('(',17),kind[17]=2,b[9]=B('(',8),puts("17");
            for(int i=1;i<=17;i++)kind[i]==1?a[++p1].print():b[++p2].print();
        }
    }
    namespace task10{
        int p1,p2,ans;
        void solve(){
            freopen("10.out","w",stdout),kind[1]=2,b[++p2]=B(0,2),kind[2]=1,a[++p1]=A(-1,-1),a[p1].ch['a']=3,a[p1].ch['i']=4,kind[3]=1,a[++p1]=A(-1,-1),a[p1].ch[0]=0,kind[4]=1,a[++p1]=A(-1,-1),a[p1].ch['a']=6,a[p1].ch['i']=5,kind[5]=2,b[++p2]=B('i',4),kind[6]=1,a[++p1]=A(-1,-1),a[p1].ch[0]=7,a[p1].ch['e']=9,kind[7]=2,b[++p2]=B('a',8),kind[8]=2,b[++p2]=B(0,2),kind[9]=1,a[++p1]=A(-1,-1),a[p1].ch['i']=10,a[p1].ch['a']=13,kind[10]=2,b[++p2]=B('i',11),kind[11]=2,b[++p2]=B('a',12),kind[12]=2,b[++p2]=B('e',4),kind[13]=2,b[++p2]=B('a',14),kind[14]=1,a[++p1]=A(-1,-1),a[p1].ch['i']=15,a[p1].ch['a']=16,a[p1].ch['e']=17,a[p1].ch[0]=18,kind[15]=2,b[++p2]=B('i',14),kind[16]=2,b[++p2]=B('a',14),kind[17]=2,b[++p2]=B('e',14),kind[18]=2,b[++p2]=B(0,2),printf("%d
    ",ans=p1+p2),p1=p2=0;
            for(int i=1;i<=ans;i++)kind[i]==1?a[++p1].print():b[++p2].print();
        }
    }
    int main(){
        int opt=read();
        if(opt==1)task1::solve();
        else if(opt==2)task2::solve();
        else if(opt==3)task3::solve();
        else if(opt==4)task4::solve();
        else if(opt==5)task5::solve();
        else if(opt==6)task6::solve();
        else if(opt==7)task7::solve();
        else if(opt==8)task8::solve();
        else if(opt==9)task9::solve();
        else if(opt==0)task10::solve();
        return 0;
    }
    【清华集训2016】工厂
  • 相关阅读:
    点击复制的代码
    色彩浅谈——同色系的变化
    网页设计中色彩的运用
    网页设计中透明效果的使用技巧
    基于栅格的网站设计
    页面之门——登录页的设计分析
    错误变惊喜,10个有趣的404页面设计(转)
    jQuery load()方法用法集锦!
    RPM命令用法
    如何使iframe透明
  • 原文地址:https://www.cnblogs.com/JDFZ-ZZ/p/14575678.html
Copyright © 2020-2023  润新知