if(s[i]=='|'){if(!
(s[i+1]<='Z'&&s[i+1]>='A'||s[i+1]<='z'&&s[i+1]>='a')&&s[i+1]!
='1'&&s[i+1]!
='0'&&s[i+1]!
='('&&s[i+1]!
='!
'||i==0)return0;
now=(node*)malloc(sizeof(node));
now->kind=or;
now->s=NULL;
now->next=NULL;
now->child=NULL;
now->polar=polar;
now->start=0;
if(last->kind==level&&last->child==NULL){
last->child=now;
}else{last->next=now;}
last=now;
i++;
}elseif(s[i]=='&'){
if(!
(s[i+1]<='Z'&&s[i+1]>='A'||s[i+1]<='z'&&s[i+1]>='a')&&s[i+1]!
='1'&&s[i+1]!
='0'&&s[i+1]!
='('&&s[i+1]!
='!
'||i==0)
return0;
now=(node*)malloc(sizeof(node));
now->kind=and;
now->s=NULL;
now->next=NULL;
now->child=NULL;
now->polar=polar;
now->start=0;
if(last->kind==level&&last->child==NULL){
last->child=now;
}else{
last->next=now;
}last=now;
i++;
}elseif(s[i]=='!
'){
if(!
(s[i+1]<='Z'&&s[i+1]>='A'||s[i+1]<='z'&&s[i+1]>='a')&&s[i+1]!
='1'&&s[i+1]!
='0'&&s[i+1]!
='('&&s[i+1]!
='!
')
return0;
polar=1-polar;
i++;
}elseif(s[i]=='-'){if(s[i+1]!
='>'||(s[i+2]!
='!
'&&s[i+2]!
='('&&!
(s[i+2]<='Z'&&s[i+2]>='A'||s[i+2]<='z'&&s[i+2]>='a'))||i==0)
return0;
now=(node*)malloc(sizeof(node));
now->kind=detrusion;
now->s=NULL;
now->next=NULL;
now->child=NULL;
now->polar=polar;
now->start=0;
if(last->kind==level&&last->child==NULL){
last->child=now;
}else{
last->next=now;
}last=now;
i=i+2;
}elseif(s[i]=='<'){if((s[i+1]!
='-'||s[i+2]!
='>')||(s[i+3]!
='!
'&&s[i+3]!
='('&&!
(s[i+3]<='Z'&&s[i+3]>='A'||s[i+3]<='z'&&s[i+3]>='a')||i==0)&&s[i+3]!
='1'&&s[i+3]!
='0')
return0;
now=(node*)malloc(sizeof(node));
now->kind=equal;
now->s=NULL;
now->next=NULL;
now->child=NULL;
now->polar=polar;
now->start=0;
if(last->kind==level&&last->child==NULL){
last->child=now;
}else{
last->next=now;
}last=now;
i=i+3;
}elseif(s[i]<='Z'&&s[i]>='A'||s[i]<='z'&&s[i]>='a'){
now=(node*)malloc(sizeof(node));
now->kind=variable;
now->next=NULL;
now->child=NULL;
now->polar=polar;
now->start=0;
now->s=(char*)malloc(MAX_L*sizeof(char));
if(last->kind==level&&last->child==NULL){
last->child=now;
}else{
last->next=now;
}last=now;
j=0;
while((s[i]<='Z'&&s[i]>='A'||s[i]<='z'&&s[i]>='a')||(s[i]<='9'&&s[i]>='0'))
(now->s)[j]=s[i];
i++;
j++;
}if(s[i]!
='|'&&s[i]!
='&'&&s[i]!
='-'&&s[i]!
='<'&&s[i]!
='\0'&&s[i]!
=')')
return0;
(now->s)[j]='\0';
polar=1;
}elseif(s[i]=='1'||s[i]=='0'){
if(s[i+1]!
='<'&&s[i+1]!
='-'&&s[i+1]!
='&'&&s[i+1]!
='|'&&s[i+1]!
=')'&&s[i+1]!
='\0')
return0;
now=(node*)malloc(sizeof(node));
now->kind=equal;
now->s=(char*)malloc(2*sizeof(char));
(now->s)[0]=s[i];
(now->s)[1]='\0';
now->next=NULL;
now->child=NULL;
now->polar=polar;
now->start=0;
if(last->kind==level&&last->child==NULL){
last->child=now;
}else{
last->next=now;
}last=now;
i++;
}elseif(s[i]=='('){
if(!
(s[i+1]<='Z'&&s[i+1]>='A'||s[i+1]<='z'&&s[i+1]>='a')&&s[i+1]!
='1'&&s[i+1]!
='0'&&s[i+1]!
='!
'&&s[i+1]!
='(')
return0;
now=(node*)malloc(sizeof(node));
now->kind=level;
now->s=NULL;
now->next=NULL;
now->child=NULL;
now->polar=polar;
now->start=0;
if(last->kind==level&&last->child==NULL){
last->child=now;
}else{
last->next=now;
}last=now;
i++;
polar=1;
if(!
inite(s,last))return0;
}elseif(s[i]==')'){
if(s[i+1]!
='P'&&s[i+1]!
='1'&&s[i+1]!
='0'&&s[i+1]!
='-'&&s[i+1]!
='<'&&s[i+1]!
='&'&&s[i+1]!
='|'&&s[i+1]!
='\0'&&s[i+1]!
=')')
return0;
i++;
return1;
}elsereturn0;
}return1;
}
node*clone(node*parent){
node*son=NULL;
if(parent==NULL)returnNULL;
son=(node*)malloc(sizeof(node));
son->kind=parent->kind;
son->polar=parent->polar;
son->s=parent->s;
son->start=parent->start;
if(parent->next!
=NULL)son->next=clone(parent->next);
elseson->next=NULL;
if(parent->child!
=NULL)son->child=clone(parent->child);
elseson->child=NULL;
returnson;
}
voidremove(node*head){
node*now=NULL;
now=head;
if(now==NULL)return;
if(now->kind==level&&now->child->kind==variable&&now->child->next==NULL){
now->polar=(now->child->polar==now->polar);
now->child->polar=1;
}
while(now->kind==level&&now->child->kind==level&&now->child->next==NULL){
now->polar=(now->polar==now->child->polar);
now->child=now->child->child;
}
if(now->next!
=NULL)remove(now->next);
if(now->child!
=NULL)remove(now->child);
}
voidrestruct(node*head){
node*now=NULL;
node*last=NULL;
node*newone=NULL,*newtwo=NULL,*newthree=NULL,*newfour=NULL,*newnow=NULL;
intorder=1;
while(order<=4){
last=head;
now=last->child;
while(now!
=NULL){
if((now->kind==variable||now->kind==level)&&order==1){
if(now->next!
=NULL&&now->next->kind==and){
newone=(node*)malloc(sizeof(node));
newone->child=NULL;
newone->kind=level;
newone->next=NULL;
newone->polar=0;
newone->s=NULL;
newone->start=0;
if(last->kind==level)last->child=newone;
elselast->next=newone;
newone->next=now->next->next->next;
newone->child=now;
now->next->next->polar=1-now->next->next->polar;
now->next->kind=detrusion;
now->next->next->next=NULL;
now=newone;
}else{
last=now;
now=now->next;
}
}elseif((now->kind==variable||now->kind==level)&&order==2){
if(now->next!
=NULL&&now->next->kind==or){
newone=(node*)malloc(sizeof(node));
newone->child=NULL;
newone->kind=level;
newone->next=NULL;
newone->polar=1;
newone->s=NULL;
newone->start=0;
if(last->kind==level)last->child=newone;
elselast->next=newone;
newone->next=now->next->next->next;
newone->child=now;
now->polar=1-now->polar;
now->next->kind=detrusion;
now->next->next->next=NULL;
now=newone;
}else{
last=now;
now=now->next;
}
}elseif((now->kind==variable||now->kind==level)&&order==3){
if(now->next!
=NULL&&now->next->kind==equal){
newone=(node*)malloc(sizeof(node));
newone->child=NULL;
newone->kind=level;
newone->next=NULL;
newone->polar=0;
newone->s=NULL;
newone->start=0;
newtwo=(node*)malloc(sizeof(node));
newtwo->child=NULL;
newtwo->kind=level;
newtwo->next=NULL;
newtwo->polar=1;
newtwo->s=NULL;
newtwo->start=0;
newthree=(node*)malloc(sizeof(node));
newthree->child=NULL;
newthree->kind=detrusion;
newthree->next=NULL;
newthree->polar=1;
newthree->s=NULL;
newthree->start=0;
newfour=(node*)malloc(sizeof(node));
newfour->child=NULL;
newfour->kind=level;
newfour->next=NULL;
newfour->polar=0;
newfour->s=NULL;
newfour->start=0;
if(last->kind==level)last->child=newone;
elselast->next=newone;
newone->next=now->next->next->next;
newone->child=newtwo;
now->next->kind=detrusion;
newtwo->child=now;
now->next->next->next=NULL;
newtwo->next=newthree;
newthree->next=newfour;
newfour->next=NULL;
newnow=clone(now);
newnow->next->kind=detrusion;
newfour->child=newnow->next->next;
newnow->next->next->next=newnow->next;
newnow->next->next=newnow;
newnow->next=NULL;