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的更多相关文章

  1. 模拟 POJ 1068 Parencodings

    题目地址:http://poj.org/problem?id=1068 /* 题意:给出每个右括号前的左括号总数(P序列),输出每对括号里的(包括自身)右括号总数(W序列) 模拟题:无算法,s数组把左 ...

  2. poj 1068 模拟

    题目链接 大概题意就是告诉你有个n个小括号,每一个")"左边有多少个"("都告诉你了,然后让你求出每一对括号之间有多少对括号(包含自己本身). 思路: 我先计算 ...

  3. POJ 1068 Parencodings 模拟 难度:0

    http://poj.org/problem?id=1068 #include<cstdio> #include <cstring> using namespace std; ...

  4. poj 1068 Parencodings(栈)

    题目链接:http://poj.org/problem?id=1068 思路分析:对栈的模拟,将栈中元素视为广义表,如 (((()()()))),可以看做 LS =< a1, a2..., a1 ...

  5. POJ 1068 Parencodings【水模拟--数括号】

    链接: http://poj.org/problem?id=1068 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=27454#probl ...

  6. poj 1068 Parencodings(模拟)

    转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj ...

  7. 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("% ...

  8. POJ 1068 Parencodings (类似括号的处理问题)

                                                                                                    Pare ...

  9. POJ 1068 Parencodings

    Parencodings Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24932   Accepted: 14695 De ...

随机推荐

  1. MEF搜索范围

    MEF对扩展组件的查找范围通常有三个: AssemblyCatalog:从某个程序集中查找. ApplicationCatalog:在应用程序所在的目录下查找. DirectoryCatalog:在某 ...

  2. Linux运维初级教程(一)Shell脚本

    序,掌握shell脚本是linux运维工程师的最基础技能. 一.脚本语言 与高级语言不通,脚本语言运行时需要调用相应的解释器来翻译脚本中的内容. 常见的脚本语言有Shell脚本.Python脚本.ph ...

  3. TTFB-首字节时间简介

    百度站长工具里看到有一个"首字节时间"的建议,第一次听说,还真不知道是什么东东.百度站长工具里面的解释是:"浏览器开始收到服务器响应数据的时间=后台处理时间+重定向时间, ...

  4. POJ 2299 Ultra-QuickSort

    离散化+树状数组求逆序数 Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 35024 Accept ...

  5. 微信事业群WXG成立 致力于打造微信大平台

    今天,微信之父张小龙带领微信团队成立微信事业群(WeiXin Group,简称WXG),致力于打造微信大平台,由他们负责微信基础平台.微信开放平台.微信支付拓展.O2O等微信延伸业务的发展,并包括邮箱 ...

  6. Android手机如何通过USB共享网络给Mac?

    最近网络挂了,mac不能上网查资料,心情非常毛躁,急切寻求用mac蹭WiFi的方法. 没有找到电脑端破解WiFi密码的软件,手头的Android手机没有root,也无法查看WiFi密码--->破 ...

  7. 错误:The Controls collection cannot be modified because the control contains code blocks (i.e. ). .

    用 <%# %>这种写法是写在数据绑定控件中的,之所以用 <%= %>会出现The Controls collection cannot be modified because ...

  8. 安装和配置VNC服务器的法则

    导读 这是一个关于怎样在你的 CentOS 7 上安装配置VNC服务的教程.当然这个教程也适合 RHEL 7 .在这个教程里,我们将学习什么是 VNC 以及怎样在 CentOS 7 上安装配置VNC ...

  9. PHP学习路线

    0x1 0x2

  10. Linux之ls命令

    s 命令可以说是linux下最常用的命令之一. -a 列出目录下的所有文件,包括以 . 开头的隐含文件.-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出.-c 输出文件 ...