HDU 4915 Parenthese sequence

扫过去。记录最大和最小可能开括号值

假设该尺寸比左小圆括号右括号尺寸。它不是不可避免

从扫再次。相同的记录最大和最小可能的左括号值

假定右括号尺寸小于开口括号的大小,它不是不可避免

最小值中的最大值,和最大值中的最小值

假设前者大于后者,则不行,假设后者大于前者则有多重解。假设相等则为唯一解(感谢LUKE队长提供的思路)

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
#define eps 1e-9
#define INF 0x3f3f3f3f

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef complex<ld> point;
typedef pair<int, int> pii;
typedef pair<pii, int> piii;

template<class T>
inline bool read(T &n)
{
    T x = 0, tmp = 1;
    char c = getchar();
    while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
    if(c == EOF) return false;
    if(c == '-') c = getchar(), tmp = -1;
    while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
    n = x*tmp;
    return true;
}
template <class T>
inline void write(T n)
{
    if(n < 0)
    {
        putchar('-');
        n = -n;
    }
    int len = 0,data[20];
    while(n)
    {
        data[len++] = n%10;
        n /= 10;
    }
    if(!len) data[len++] = 0;
    while(len--) putchar(data[len]+48);
}
//-----------------------------------

const int L=1000050;
int a[L][2],b[L][2];

int main()
{
    int i,j,l,sig,ta,tb;
    char s[L];
    while(scanf("%s",s+1)!=EOF)
    {
        l=strlen(s+1);
        sig=0;
        if(l%2==1)
        {
            printf("None\n");
            continue;
        }
        a[0][0]=a[0][1]=b[l][0]=b[l][1]=0;
        for(i=1; i<=l; i++)
        {
            if(s[i]=='(')a[i][0]=a[i-1][0]+1,a[i][1]=a[i-1][1]+1;
            else if(s[i]==')')
            {
                if(a[i-1][0]==0)a[i][0]=1;
                else a[i][0]=a[i-1][0]-1;
                a[i][1]=a[i-1][1]-1;
            }
            else if(s[i]=='?

') { if(a[i-1][0]==0)a[i][0]=1; else a[i][0]=a[i-1][0]-1; a[i][1]=a[i-1][1]+1; } if(a[i][0]>a[i][1])sig=1; } if(sig) { printf("None\n"); continue; } for(i=l; i>=1; i--) { if(s[i]==')')b[i-1][0]=b[i][0]+1,b[i-1][1]=b[i][1]+1; else if(s[i]=='(') { if(b[i][0]==0)b[i-1][0]=1; else b[i-1][0]=b[i][0]-1; b[i-1][1]=b[i][1]-1; } else if(s[i]=='?') { if(b[i][0]==0)b[i-1][0]=1; else b[i-1][0]=b[i][0]-1; b[i-1][1]=b[i][1]+1; } if(b[i][0]>b[i][1])sig=1; } if(sig) { printf("None\n"); continue; } for(i=1; i<=l; i++) { ta=max(a[i][0],b[i][0]); tb=min(a[i][1],b[i][1]); if(ta>tb) { sig|=1; break; } if(ta<tb) { sig|=2; } } if(sig&1) { printf("None\n"); continue; } else if(sig&2) { printf("Many\n"); continue; } else printf("Unique\n"); } return 0; }





版权声明:本文博客原创文章。博客,未经同意,不得转载。

posted @ 2015-07-29 08:52  phlsheji  阅读(216)  评论(0编辑  收藏  举报