’?‘可以任意改变成‘(’ 或者‘)’,问序列有可行解,可行解是否唯一
首先先判断是否有解
判断是否为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