HDU 4915 水

’?‘可以任意改变成‘(’ 或者‘)’,问序列有可行解,可行解是否唯一

首先先判断是否有解

判断是否为Many,记录每个位置的左边和右边各需要多少个‘(’或‘)’

左边所需‘(’若正好等于 (i+1)/2,说明若有解则只有唯一解,

右边所需‘)若正好等于(len-i)/2,说明若有解则只有唯一解,

若均有多解,判断是否相互包含对方

例:((()))变为 (()());

#include "stdio.h"
#include "string.h"
int a[1000010],b[1000010];
char str[1000010];

int main()
{
    int i,len,flag,mark1,mark2;
    while (gets(str))
    {
        len=strlen(str);
        if (len%2==1)
        {
            printf("None\n");
            continue;
        }
        if (str[0]==')' || str[len-1]=='(')
        {
            printf("None\n");
            continue;
        }
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));

        flag=1;

        for (i=1;i<len;i++)
        {
            a[i]=a[i-1];
            if (str[i]==')') a[i]++;
            if (a[i]>(i+1)/2)
            {
                printf("None\n");
                flag=0;
                break;
            }
        }
        if(flag==0) continue;

        for (i=len-2;i>=0;i--)
        {
            b[i]=b[i+1];
            if (str[i]=='(') b[i]++;
            if (b[i]>(len-i)/2)
            {
                printf("None\n");
                flag=0;
                break;
            }
        }
        if (flag==0) continue;

        mark1=mark2=0;

        for (i=0;i<len;i++)
        {
            if (b[i]==(len-i)/2) break;
            if (str[i]=='?') mark2=i;
        }

        for (i=len-1;i>=0;i--)
        {
            if (a[i]==(i+1)/2) break;
            if (str[i]=='?') mark1=i;
        }

        if (mark1!=0 && mark2!=0 && mark1<mark2) printf("Many\n");
        else printf("Unique\n");

    }
    return 0;
}

HDU 4915 水

时间: 2024-10-11 11:07:48

HDU 4915 水的相关文章

HDU 4968 (水dp 其他?)

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 #include <map> 6 using namespace std; 7 const int inf = 0x3f3f3f3f; 8 const int MAX = 200+10; 9 double GPA[10],dp1[20][30000],dp2[20][30000

2014多校联合五(HDU 4911 HDU 4915 HDU 4920)

HDU 4911 Inversion 题意:n个数字  通过k次相邻交换  使得逆序对数最少 思路:如果序列为 XXXABYYY  假设A和B位置互换  易知X和AB.Y和AB的逆序对数不变  换句话说一次交换最多使逆序对减少1  那么只需要求原逆序对数和k进行比较即可 代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 100100 type

hdu 4416 水题 浙大计算机研究生复试上机考试-2005年 可是发现自己写代码有问题

Spring3与Hibernate4整合时出现了nested exception is java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider. hibernate3的时候,用spring来控制sessionfactory用的可以是org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean,因为用的是hibernate4所以照猫画

HDU 4915 Parenthese sequence

HDU 4915 Parenthese sequence 题目链接 题意:给定一个有?的左右括号串,?能替代为'('或')',问括号匹配是否唯一或多种或不可能 思路:先从右往左扫一边,维护一个up, down表示当前位置右边右括号剩余个数的上限和下限,如果维护完后起始位置的下限为0,那么就是可以的,因为为0就代表没有多余的右括号.然后在从左往右扫一遍,和上面一样的处理,只是遇到每个问号的位置时,试一下左括号和右括号,如果都满足,表示这个位置能放左右括号,是多种可能,如果所有?都只有唯一的方法,那

hdu 4915 Parenthese sequence(高效)

题目链接:hdu 4915 Parenthese sequence 题目大意:给定一个序列,由(,),?组成?可以表示(或者),问说有一种.多种或者不存在匹配. 解题思路:从左向右,从右向左,分别维护左括号和右括号可能的情况,区间上下界.如果过程中出现矛盾,则为None,否则要判断唯一解还是多解.枚举每个问号的位置,假设该问号可为左右括号,则有多解. #include <cstdio> #include <cstring> #include <algorithm> us

HDU 4915 Parenthese sequence(瞎搞题)

从左向右扫一遍左括号的最大值,与最小值. 从右向左扫一遍右括号的最大值,与最小值. 比较最大值中的最小数与最小中的最大数看能否有交集,0个,1个或者多个. Parenthese sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 301    Accepted Submission(s): 129 Problem De

HDU 4915 多校5 Parenthese sequence

比赛的时候想了一个自认为对的方法,WA到死,然后还一直敲下去,一直到晚上才想到反例 找是否存在解比较好找,这种左右括号序列,把(当成1,把)当成-1,然后从前往后扫,+1或者-1 遇到?就当初(,然后如果扫到最后 中间没有出现负数说明左括号没问题 然后同样的方法从后往前扫,判断右括号那里是不是有问题即可.都没问题就有解,否则无解 当然应该要先判断下序列长度是不是偶数,奇数肯定是无解 至于为什么要像之前的处理即可判断有无解,首先只有正好走完的时候 和值为0才是真正合法(因为这个时候左右括号都对应了

HDU 4915 Parenthese sequence _(:зゝ∠)_ 呵呵

呵呵不是我做的 #include <cstdio> #include <cstring> #include <algorithm> const int N = 1000000 + 10; char s[N]; int d[N], num[N]; int main() { while (~scanf("%s", s)) { memset(num, 0, sizeof num); int len = strlen(s); int f = 1, v = 0

hdu 4915 Parenthese sequence(模拟)2014多校训练第5场

Parenthese sequence                                                                     Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description bobo found an ancient string. The string contains only t