天天看点

HDU 4915 Parenthese sequence

#include<string>
#include<cstring>
#include<iostream>
#include<cstdio>
#include<fstream>
#define MAXN 1000005
using namespace std;
int mid[MAXN];
int main() {
    /*
    假如没有"?",判断方法为:
    1、从左到右遍历每个点,记录之前的"("和")"数目,任意一点之前的"("数大于等于")"数。
    否则左边没有足够的"("可以与")"匹配,而右边的"("无法跟左边的")"匹配。
    2、从右到左同理。
    满足这两点即可判断该串括号已匹配。
    */
    string str;
    int i,j;
    while(cin>>str) {
        int len=str.size();
        if(len&1) {
        loop:
            puts("None");
            continue;
        }
        int left=0,right=0,num=0;
        /*
        从左到右,每次"("和"?"的个数比")"个数少1时,将"?"全部换成"("。
        这种状态下,任意一个"?"变成")"时都会令之前的")"个数大于"("个数,从而导致无法匹配。
        因此,必须将之前的"?"全部变为"("才能保证其依然具有匹配可能。
        */
        for(i=0;i<len;++i) {
            if(str[i]=='(') ++left;
            else if(str[i]==')')    ++right;
            else    mid[num++]=i;
            if(left+num<right)  goto loop;
            if(left+num==right+1) {
                for(j=0;j<num;++j) 
                    str[mid[j]]='(';
                left+=num;
                num=0;
            }
        }
        left=0,right=0,num=0;
        /*
        从右至左同理
        */
        for(i=len-1;i>=0;--i) {
            if(str[i]=='(') ++left;
            else if(str[i]==')')    ++right;
            else    mid[num++]=i;
            if(right+num<left)  goto loop;
            if(right+num==left+1) {
                for(j=0;j<num;++j) 
                    str[mid[j]]=')';
                right+=num;
                num=0;
            }
        }
        /*
        若字符串中已不存在"?",则表示方案唯一。
        */
        for(i=0;i<len;++i) {
            if(str[i]=='?') break;
        }
        if(i==len)  puts("Unique");
        else    puts("Many");
    }
    return 0;
}
           
ACM