题目2 : 展胜地的鲤鱼旗 (hihoCoder挑战赛20 )

题目2 : 展胜地的鲤鱼旗

时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB

描述

岩手县北上市的「北上市立公园展胜地」,是陆奥国三大樱花名所之一。每年的四月中旬到五月初,这里都会举办盛大的祭奠。除了可以在盛开的樱花步道上乘坐观光马车徐行、还有横跨北上川上的鲤鱼旗,河畔还有当地特有的为祭奠祖先而编创的北上鬼剑舞。

题目2 : 展胜地的鲤鱼旗 (hihoCoder挑战赛20 )_第1张图片

假设,我们用一个包含 '(', ')'的括号字符串来区别每面鲤鱼旗的方向。一段括号序列被称为合法的,当且仅当满足两个条件:一、对于整个序列,左括号数量等于右括号;二、对于任意前缀,左括号的数目都不小于右括号的数目。岛娘想知道,对于一串括号字符串,有多少子串是合法的,你能帮助她么。

输入

输入数据仅一行,包含一个长度为 n (1 ≤ n ≤ 106) 的括号字符串。

输出

输出一行,表示合法的括号子串的数目。

样例输入
(()())
样例输出
4

理解题意理解了半天。。

二、对于任意前缀,左括号的数目都不小于右括号的数目。

这句话的意思是当前串作为其它串的前缀必须满足左括号的数目都不小于右括号的数目  NND。。我语文不好吗?我读了半天

#include <stdio.h>
#include <string.h>
int left[1000000+10];
int right[1000000+10];
int main()
{
	char ch;
	int t=1;
	left[0]=right[0]=0;
	while(~scanf("%c",&ch))
	{
		if(ch=='(')
		left[t]=left[t-1]+1,right[t]=right[t-1];
		else if(ch==')')
		right[t]=right[t-1]+1,left[t]=left[t-1];
		else if(ch=='\n')
		{
			int result=0;
			for(int i=1;i<t;i++)
			{
				for(int j=i;j<t;j++)
				{
					int left_count=left[j]-left[i-1];
					int right_count=right[j]-right[i-1];
					if(left_count<right_count)
					break;
					if(left_count==right_count)
					{
					//	printf("%d %d\n",i,j);
						result++;
					}
				}
			}
			printf("%d\n",result);
			memset(left,0,sizeof(left));
			memset(right,0,sizeof(right));
			t=1;
		}
		t++;
	}
	return 0;
} 


你可能感兴趣的:(字符串,前缀,hihoCoder挑战赛20)