您的位置:首页 > 产品设计 > UI/UE

HDU 4915 Parenthese sequence

2014-08-13 00:22 295 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: