标签:blog io for 2014 ar amp size log
’?‘可以任意改变成‘(’ 或者‘)’,问序列有可行解,可行解是否唯一
首先先判断是否有解
判断是否为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;
}
标签:blog io for 2014 ar amp size log
原文地址:http://blog.csdn.net/u011932355/article/details/38399577