hdu 4915 Parenthese sequence 多校第五场

判断一个序列是否是有效是简单的。

但是判断序列是不是有多个解会出问题。

那么从i=0 ~l

如果读到问号,判断该问号成为(是否能有效,该问号为)是否有效。

如果都有效,则必有多个解。

如果都无效,则无解。

如果一个有效,则把问号改成有效的括号。

代码实现如下

#include<stdio.h>
#include<string.h>
char s[1000005],tp[1000005];
int l;
int pd()
{
    int zuo,you,num,i;
    num=0;
    zuo=0;
    you=0;
    for(i=0;i<l;i++)
    {
       num++;
       if(num==1)
       {
        if(tp[i]=='?')
          tp[i]='(';

       }
                
                if(tp[i]=='(') zuo++;
                if(tp[i]==')') you++;
                if(you>num/2) 
                {
                    return 0;
                }
                if(num%2==0)
                {
                    if(you==num/2) 
                    {
                        zuo=0;
                        you=0;
                        num=0;
                    }
                }
        
    }
    if(zuo>num/2) return 0;
    num=0; 
    zuo=0;
    you=0;
            for(i=l-1;i>=0;i--)
            {
                num++;
                if(num==1)
                {
                    if(tp[i]=='?')
                    tp[i]=')';
                }
                if(tp[i]=='(') zuo++;
                if(tp[i]==')') you++;
                if(zuo>num/2) 
                {
                    return 0;
                }
                if(num%2==0)
                {
                    if(zuo==num/2) 
                    {
                        zuo=0;
                        you=0;
                        num=0;
                    }
                }
                
            }
            if(you>num/2) return 0;
            return 1;
    
}
int main()
{
   int zuo,you,x,y,i;
   while(scanf("%s",s)!=EOF)
   {
       l=strlen(s);
       if(l%2==1)
       {
           printf("None\n");
           continue;
    }
    
    else
    {
     strcpy(tp,s);
  x=pd();
  if(x==0)
  {
   printf("None\n");
   continue;
  }
        for(i=0;i<l;i++)
        {
          if(s[i]=='?')
          {
              strcpy(tp,s);
              tp[i]=')';
              x=pd();
              strcpy(tp,s);
              tp[i]='(';
              y=pd();
              if(x+y==2) 
              {printf("Many\n");
              break;
              }
              if(x+y==0)
              {
                  printf("None\n");
                  break;
              }
              if(x==1)
              s[i]=')';
              else 
              s[i]='(';             
            }    
            
        } 
        if(i==l)
            {
                printf("Unique\n");
                
            }
    } 
   }
   return 0;    
}

 


 

你可能感兴趣的:(hdu 4915 Parenthese sequence 多校第五场)