博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 4915 Parenthese sequence--2014 Multi-University Training Contest 5
阅读量:6126 次
发布时间:2019-06-21

本文共 2311 字,大约阅读时间需要 7 分钟。

主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4915

Parenthese sequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 172    Accepted Submission(s): 69


Problem Description
bobo found an ancient string. The string contains only three charaters -- "(", ")" and "?".
bobo would like to replace each "?" with "(" or ")" so that the string is valid (defined as follows). Check if the way of replacement can be uniquely determined.
Note:
An empty string is valid.
If S is valid, (S) is valid.
If U,V are valid, UV is valid.
 

Input
The input consists of several tests. For each tests:
A string s
1s
2…s
n (1≤n≤10
6).
 

Output
For each tests:
If there is unique valid string, print "Unique". If there are no valid strings at all, print "None". Otherwise, print "Many".
 

Sample Input
 
??

???

? (?

?

 

Sample Output
 
Unique Many None
 

Author
Xiaoxu Guo (ftiasch)
 

Source
 

Recommend
We have carefully selected several similar problems for you:            
 

 |   |   | 

这道题目,比赛的时候和队友讨论了一下,认为搜索TLE的可能性巨大。于是果断採取了其它的方法。

我们的方法事实上就是扫了二遍。中复杂度接近O(N).

用cnt来统计‘(’的数量。接着模拟一个链表来存储可能发生变化的'?'.

head表示链表头。遇到')'时若cnt>0。即前面还有'('剩余时,则让cnt--,即相互抵消掉。若cnt==0,,则取

出链表中的一个元素,把它改成'(',即让cnt++。到最后假设cnt还有剩,则显然是不可能的,但要推断是"Unique"

还是"Many"。则须要把表头所表示的元素改成'(',若还是符合则是"Many" 否则是"Unique".

详见程序啦。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define CLR(A) memset(A,-1,sizeof(A))typedef long long ll;const int MAX=1000010;char str[MAX];int next[MAX],head=-1,cnt,tail=0;int solve(){ head=-1;cnt=0;tail=0; CLR(next); for(int i=0;str[i];i++){ if(str[i]=='(') cnt++; else if(str[i]==')'){ if(cnt==0){ if(head==-1) return 0; cnt++; head=next[head]; } else cnt--; } else{ if(cnt>0){ cnt--; next[tail]=i; tail=i; if(head==-1) head=i; } else{ cnt++; } } } if(cnt!=0) return 0; else return 1;}int main(){ while(~scanf("%s",str)){ int len=strlen(str); bool ret=1; if(len&1){ printf("None\n");continue; } ret=solve(); if(ret==0){ printf("None\n");continue; } if(head==-1){ printf("Unique\n");continue; } str[head]='('; ret=solve(); if(ret==0) printf("Unique\n"); else printf("Many\n"); } return 0;}

版权声明:本文博主原创文章,博客,未经同意不得转载。

你可能感兴趣的文章
Jenkins持续集成环境部署
查看>>
emoji等表情符号存mysql的方法
查看>>
检查磁盘利用率并且定期发送告警邮件
查看>>
MWeb 1.4 新功能介绍二:静态博客功能增强
查看>>
linux文本模式和文本替换功能
查看>>
Windows SFTP 的安装
查看>>
摄像机与绕任意轴旋转
查看>>
rsync 服务器配置过程
查看>>
预处理、const与sizeof相关面试题
查看>>
爬虫豆瓣top250项目-开发文档
查看>>
Elasticsearch增删改查
查看>>
oracle归档日志增长过快处理方法
查看>>
有趣的数学书籍
查看>>
teamviewer 卸载干净
查看>>
多线程设计模式
查看>>
解读自定义UICollectionViewLayout--感动了我自己
查看>>
SqlServer作业指定目标服务器
查看>>
UnrealEngine4.5 BluePrint初始化中遇到编译警告的解决办法
查看>>
User implements HttpSessionBindingListener
查看>>
抽象工厂方法
查看>>