推断一个序列是否是有效是简单的。
可是推断序列是不是有多个解会出问题。
那么从i=0 ~l
假设读到问号,推断该问号成为(能否有效,该问号为)是否有效。
假设都有效,则必有多个解。
假设都无效,则无解。
假设一个有效,则把问号改成有效的括号。
代码实现例如以下
#include<stdio.h> #include<string.h> char s[1000005],tp[1000005]; int l; int pd() { int zuo,you,num,i; num=0; zuo=0; you=0; for(i=0;i<l;i++) { num++; if(num==1) { if(tp[i]=='?') tp[i]='('; } if(tp[i]=='(') zuo++; if(tp[i]==')') you++; if(you>num/2) { return 0; } if(num%2==0) { if(you==num/2) { zuo=0; you=0; num=0; } } } if(zuo>num/2) return 0; num=0; zuo=0; you=0; for(i=l-1;i>=0;i--) { num++; if(num==1) { if(tp[i]=='?') tp[i]=')'; } if(tp[i]=='(') zuo++; if(tp[i]==')') you++; if(zuo>num/2) { return 0; } if(num%2==0) { if(zuo==num/2) { zuo=0; you=0; num=0; } } } if(you>num/2) return 0; return 1; } int main() { int zuo,you,x,y,i; while(scanf("%s",s)!=EOF) { l=strlen(s); if(l%2==1) { printf("None\n"); continue; } else { strcpy(tp,s); x=pd(); if(x==0) { printf("None\n"); continue; } for(i=0;i<l;i++) { if(s[i]=='?') { strcpy(tp,s); tp[i]=')'; x=pd(); strcpy(tp,s); tp[i]='('; y=pd(); if(x+y==2) {printf("Many\n"); break; } if(x+y==0) { printf("None\n"); break; } if(x==1) s[i]=')'; else s[i]='('; } } if(i==l) { printf("Unique\n"); } } } return 0; }
时间: 2024-10-08 13:35:40