比赛的时候想了一个自认为对的方法,WA到死,然后还一直敲下去,一直到晚上才想到反例

找是否存在解比较好找,这种左右括号序列,把(当成1,把)当成-1,然后从前往后扫,+1或者-1 遇到?就当初(,然后如果扫到最后 中间没有出现负数说明左括号没问题

然后同样的方法从后往前扫,判断右括号那里是不是有问题即可。都没问题就有解,否则无解

当然应该要先判断下序列长度是不是偶数,奇数肯定是无解

至于为什么要像之前的处理即可判断有无解,首先只有正好走完的时候 和值为0才是真正合法(因为这个时候左右括号都对应了嘛)

他是偶数个+1或者-1,扫下来的和肯定也是偶数,只要扫到最后不出现负数,(出现负数说明中间有括号找不到匹配的括号)我们只要把中间的某些括号反向,最终一定可以使序列和值为0。所以正反两遍下来即可

最难的就是判断many和unique了,想了很多方法,依然做不好这一题(嘿嘿,盗用了后会无期的台词),还是最普遍的一种最好,即,判断是否有>=2个括号,正向和方向都可以

判断是否可行的方法就是上面的那个,但是我不可能暴力枚举每个括号,然后执行上面的操作,来判断他是否可行吧。。会超时的

所以要预处理一下,弄个prefix0代表i前面是否有前缀和<=1的,suffix0代表i后面的前缀和是否有<=1的,对某个?,如果由正变反的时候,suffix0存在,则不行,由反变正,prefix0存在,也不行

为什么呢,。因为反向代表总和值-2或者+2,所以只要有<=1的和值存在,反向可能就会使其变负值,是非法的。。。所以我们这样通过预处理一遍,再一遍扫描下来,即可得出结果

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1000000+10;
char str[N];
int num[N];
int prefix[N],suffix[N];
int pre0[N],suf0[N];
int main()
{
while (scanf("%s",str)!=EOF)
{
int len=strlen(str);
if (len&1){
printf("None\n");
continue;
}
memset(prefix,0,sizeof(prefix[0])*(len+2));
memset(suffix,0,sizeof(suffix[0])*(len+2));
memset(pre0,0,sizeof(pre0[0])*(len+2));
memset(suf0,0,sizeof(suf0[0])*(len+2));
for (int i=0;i<len;i++){
if (str[i]=='?') num[i+1]=0;
else if (str[i]=='(') num[i+1]=1;
else num[i+1]=-1; }
bool flag=1;
for (int i=1;i<=len;i++){
if (num[i]!=0) prefix[i]=prefix[i-1]+num[i];
else prefix[i]=prefix[i-1]+1;
if (prefix[i]<0){
flag=0;
break;
} }
for (int i=len;i>=1;i--){
if (prefix[i]<=1) pre0[i]=pre0[i+1]+1;
else pre0[i]=pre0[i+1];
}
if(!flag){
printf("None\n");
continue;
}
for (int i=len;i>=1;i--){
if (num[i]!=0) suffix[i]=suffix[i+1]-num[i];
else suffix[i]=suffix[i+1]+1;
if (suffix[i]<0){
flag=0;
break;
} }
for (int i=1;i<=len;i++){
if (suffix[i]<=1) suf0[i]=suf0[i-1]+1;
else suf0[i]=suf0[i-1];
}
if (!flag){
printf("None\n");
continue;
}
int cur=0;
for (int i=2;i<len;i++){
//cout<<"Test "<<i<<endl;
if (num[i]==0){
//cout<<prefix[i]<<" pre "<<pre0[i]<<endl;
//cout<<suffix[i]<<" suf "<<suf0[i]<<endl;
if (prefix[i]>=2 &&pre0[i]==0){
if (suffix[i]>=2 && suf0[i]==0) cur++;
}
}
}
if (cur>1) printf("Many\n");
else printf("Unique\n");
}
return 0;
}

  

HDU 4915 多校5 Parenthese sequence的更多相关文章

  1. hdu 4915 Parenthese sequence(模拟)2014多培训学校5现场

    Parenthese sequence                                                                     Time Limit: ...

  2. hdu 4915 Parenthese sequence--2014 Multi-University Training Contest 5

    主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4915 Parenthese sequence Time Limit: 2000/1000 MS (Ja ...

  3. hdu4915 Parenthese sequence 贪心O(n)解法(new)

    hdu4915 Parenthese sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K ...

  4. 2017 多校4 Wavel Sequence

    2017 多校4 Wavel Sequence 题意: Formally, he defines a sequence \(a_1,a_2,...,a_n\) as ''wavel'' if and ...

  5. hdu 4915 Parenthese sequence 多校第五场

    推断一个序列是否是有效是简单的. 可是推断序列是不是有多个解会出问题. 那么从i=0 ~l 假设读到问号,推断该问号成为(能否有效,该问号为)是否有效. 假设都有效,则必有多个解. 假设都无效,则无解 ...

  6. HDU 4915 Parenthese sequence

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4915 解题报告:从前往后遍历一次,每次判断')'的数目是不是满足 n < (i +1)/ 2,从 ...

  7. HDU 4915 Parenthese sequence _(:зゝ∠)_ 哈哈

    哦,我没做 #include <cstdio> #include <cstring> #include <algorithm> const int N = 1000 ...

  8. hdu多校1002 Balanced Sequence

    Balanced Sequence Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s) ...

  9. hdu 4915 括号匹配+巧模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=4915 给定一个序列,由()?组成,其中?可以表示(或者),问说有一种.多种或者不存在匹配. 从左向右,优先填满n ...

随机推荐

  1. 简单讲解什么是黑帽SEO

    此文章主要讲的是黑帽SEO之搜索引擎劫持: SEO(Search Engine Optimization)搜索引擎优化,简单来说,就是让网站的排名更高,比如,搜索"博客"这个关键字 ...

  2. 【剑指Offer面试编程题】题目1384:二维数组中的查找--九度OJ

    题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含 ...

  3. 启动storm任务时,异常提示

    启动storm任务时,异常提示: 14182 [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2000] WARN o.a.s.s.o.a.z.s.NIOServerCnx ...

  4. AJAX的兼容处理方式

    AJAX在网站服务中使用到频率很高,也需要考虑各个浏览器版本的兼容性,本示例中详细介绍简单快捷的处理兼容性问题. <!DOCTYPE HTML> <html> <head ...

  5. 1-6SpringBoot之事务管理@Transactional

    以前学ssh ssm都有事务管理service层通过applicationContext.xml配置,所有service方法都加上事务操作: 用来保证一致性,即service方法里的多个dao操作,要 ...

  6. 通用dao的demo

          代码片段 1. [代码]整型映射工具 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package org.dave.common.databas ...

  7. Vue.js面试题

    一.什么是MVVM? MVVM是Model-View-ViewModel的缩写.MVVM是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑:View 代表UI ...

  8. 实训41 S7通信 单向连接 基于DP网络通信

    连接的基本概念? 连接是指两个通信伙伴之间执行通信服务建立的逻辑链路,而不是指两个站之间用物理媒体(例如电缆)实现的连接. 连接相当于 通信伙伴之间 一条虚拟的"专线". 一条物理 ...

  9. 【转】Windows中使用TortoiseGit提交项目到GitLab配置

    转  原文地址 https://www.cnblogs.com/xiangwengao/p/4134492.html   下文来给各位介绍Windows中使用TortoiseGit提交项目到GitLa ...

  10. C++中数据类型表示范围

    32位机器环境下结果如下: Type Size 数值范围 无值型void 0 byte 无值域 布尔型bool 1 byte true   false 有符号短整型short [int] /signe ...