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; }
相关文章推荐
- hdu 4915 Parenthese sequence
- HDU 4915 Parenthese sequence
- hdu 4915 Parenthese sequence
- hdu 4915 Parenthese sequence(高效)
- hdu 4915 Parenthese sequence--2014 Multi-University Training Contest 5
- hdu 4915 Parenthese sequence(模拟)2014多校训练第5场
- HDU 4915 Parenthese sequence _(:зゝ∠)_ 哈哈
- HDU 4915 Parenthese sequence DP
- HDU 4915 Parenthese sequence
- HDU 4915 Parenthese sequence
- hdu 4915 Parenthese sequence--2014 Multi-University Training Contest 5
- HDU 4915 Parenthese sequence(瞎搞题)
- hdu 4915 Parenthese sequence (贪心+模拟)
- hdu 4915 Parenthese sequence 多校第五场
- hdu 4915 Parenthese sequence
- hdu 4915 Parenthese sequence(模拟)2014多培训学校5现场
- hdu 4915 Parenthese sequence(多校第5场,括号匹配,贪心算法)
- HDU 4915 多校5 Parenthese sequence
- HDU 4915 Parenthese sequence
- hdu 4915 Parenthese sequence(多校第5场,括号匹配,dp)