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\n",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\n",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\n",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\n",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】工厂

 

posted @ 2021-03-27 22:02  QDK_Storm  阅读(111)  评论(0编辑  收藏  举报