POJ 1068
http://poj.org/problem?id=1068
这道题是一道模拟的题目
题目大意呢,p代表前面的'('的个数,而w代表这个括号所包括的括号的个数;
给你p,要你求w;
解题思路:
首先,你肯定要把p所对应的那一个括号序列还原出来,当然,你也没必要说用字符把()表示出来,完全就可以用0和1分别代替左括号与右括号
其次,你就应该找出哪两个括号是相匹配的。比如说(((()()()))),p为456666,第一个)所匹配的为第4个左括号,第二个所匹配的为第5个左括号,第三个所匹配的为第6个左括号
从左往右对应的右括号分别所匹配的左括号的顺序为4,5,6,3,2,1。有了这个顺序,解题就容易多了,他们包含的括号数目就是为p类型-所对应的括号数+1。
也就是说括号数分别为4-4+1,5-5+1,6-6+1,6-3+1,6-2+1,6-1+1;
这个道理就在于p代表的为‘(’的个数,而当那个‘)’匹配的正是它前面的‘(’时,也就代表着总共前面有n个左括号,而它前面的正好是第n个,所以它们肯定没有包含括号,所以只有1个括号,这是加一的目的
而如果前面有N个左括号,而它所匹配的不是第N个,那么说明肯定有几个括号是被它所包含的
#include <stdio.h>
#include <iostream>
#include <string.h> using namespace std; int ans[],a[],b[],mark[]; int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int m,x;
scanf("%d",&m);
a[]=;
for(int i=;i<=m;i++)
scanf("%d",&a[i]);
memset(ans,,sizeof(ans)); //ans还原那个原括号序列,我用0代表左括号,1代表右括号
memset(mark,,sizeof(mark)); //mark使用来标记这个左括号是第几个左括号的。目的是匹配括号
for(int i=;i<=m;i++)
ans[i+a[i]]=; //恢复原序列
for(int i=,k=;i<=*m;i++)
if(ans[i]==) {mark[i]=k;k++;} //记录左括号是第几个左括号
for(int i=,k=;i<=*m;i++)
{
if(ans[i]==)
{
for(x=i;x>=;x--) //找出它前面的第一个0,即为它所匹配的0;
if(ans[x]==) break;
b[k]=mark[x]; //记录这个右括号是匹配第几个左括号
k++;
ans[i]=-; //匹配过的,变化数值,以免以后再次匹配
ans[x]=-;
}
}
for(int i=;i<=m;i++)
{
if(i==m) printf("%d\n",a[i]-b[i]+);
else printf("%d ",a[i]-b[i]+);
}
}
return ;
}
POJ 1068的更多相关文章
- 模拟 POJ 1068 Parencodings
题目地址:http://poj.org/problem?id=1068 /* 题意:给出每个右括号前的左括号总数(P序列),输出每对括号里的(包括自身)右括号总数(W序列) 模拟题:无算法,s数组把左 ...
- poj 1068 模拟
题目链接 大概题意就是告诉你有个n个小括号,每一个")"左边有多少个"("都告诉你了,然后让你求出每一对括号之间有多少对括号(包含自己本身). 思路: 我先计算 ...
- POJ 1068 Parencodings 模拟 难度:0
http://poj.org/problem?id=1068 #include<cstdio> #include <cstring> using namespace std; ...
- poj 1068 Parencodings(栈)
题目链接:http://poj.org/problem?id=1068 思路分析:对栈的模拟,将栈中元素视为广义表,如 (((()()()))),可以看做 LS =< a1, a2..., a1 ...
- POJ 1068 Parencodings【水模拟--数括号】
链接: http://poj.org/problem?id=1068 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=27454#probl ...
- poj 1068 Parencodings(模拟)
转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj ...
- POJ 1068 AC 2014-01-07 15:24 146人阅读 评论(0) 收藏
POJ的题目都是英文的,所以,,,还是直接贴代码吧 #include<stdio.h> int main(){ int x,y,z; int n,nm,max; scanf("% ...
- POJ 1068 Parencodings (类似括号的处理问题)
Pare ...
- POJ 1068 Parencodings
Parencodings Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24932 Accepted: 14695 De ...
随机推荐
- centos 7.0 编译 安装mysql 5.6.22 过程 已完成~ 成功~ 撒花~
mysql 下载目录/usr/local/srcmysql 解压目录 /usr/local/bin/mysql GitHub https://github.com/mysql/mysql-server ...
- CentOS 6.5安装配置LNMP服务器(Nginx+PHP+MySQL)
CentOS 6.5安装配置LNMP服务器(Nginx+PHP+MySQL) 一.准备篇: /etc/init.d/iptables stop #关闭防火墙 关闭SELINUX vi /etc/sel ...
- Spring入门_02_属性注入
Spring 的set方法(属性)注入 UserAction类中设置属性和get.set方法.(实际上只需要set方法) private List list = null; private Set s ...
- MySQL主从数据库同步延迟问题解决(转)
最近在做MySQL主从数据库同步测试,发现了一些问题,其中主从同步延迟问题是其中之一,下面内容是从网上找到的一些讲解,记录下来以便自己学习: MySQL的主从同步是一个很成熟的架构,优点为:①在从服务 ...
- shell编程中for file in $*; do是什么意思.
$*是此行命令所在函数(脚本)的所有被传入参数的合集与$@类似,不用引号的情况下没有区别区别是当被""扩起来以后"$*"被当做一个字符串"$@&quo ...
- 【8-21】java学习笔记03
内部类(静态内部类&非静态内部类) 静态外部类成员方法(如main方法)不能直接访问内部类,但是可以通过外部类的方法,在其中创建内部类实例对象,间接使用: 非静态内部类可以直接访问外部类的私有 ...
- MySQL中MAX函数与Group By一起使用的注意事项(转)
mysql> select * from test; +----+-------+------+-------+ | id | name | age | class | +----+------ ...
- seajs的那点事(很坑的事),和本白的一点事(更坑的事)
在开始之前,偶先吐槽加逗比一下,2天前,CCAV的本白和百度的菊花成功潜入到了携程大楼 然后在没有找到他们运维的情况下,四处乱逛,企图把他们的服务器给root一下,然后再瞎逛之后到了一个很神奇的地方 ...
- [译]Mongoose指南 - Connection
使用mongoose.connect()方法创建连接 mongoose.conect('mongodb://localhost/myapp'); 上面的代码是通过默认端口27017链接到mongodb ...
- Ionic 常见问题及解决方案
前言 Ionic是目前较为流行的Hybird App解决方案,在Ionic开发过程中会遇到很多常见的开发问题,本文尝试对这些问题给出解决方案. 一些常识与技巧 list 有延迟,可以在ion-cont ...