Bracket Sequences Concatenation Problem CodeForces - 990C(括号匹配水题)

明确一下  一个字符串有x左括号不匹配  和 另一个字符串有x个右括号不匹配  这俩是一定能够匹配的

脑子有点迷 emm。。。

所以统计就好了  统计x个左括号的有几个,x个右括号的有几个 然后 乘一下

如果一个串 同时存在左右括号都不匹配的情况 则忽略 因为这个串需要另外两个括号去匹配

不要忘了处理左右括号已经匹配的情况

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5, INF = 0x7fffffff;
typedef long long LL;
LL a[maxn], b[maxn];
string str;
int main()
{
    int n;
    cin>> n;
    int lef, rig, maxx = -INF;
    for(int i=0; i<n; i++)
    {
        cin>> str;
        int len = str.size();
        maxx = max(len, maxx);
        lef = INF;
        rig = 0;
        for(int j=0; j<len; j++)
        {
            if(str[j] == ‘(‘)
                rig++;
            else
                rig--;
            lef = min(lef, rig);
        }
        if(lef < 0 && rig > lef)    //说明两边同时存在不匹配的左右括号
            continue;
        if(lef < 0)                 //有多的不匹配的左括号
            b[abs(lef)]++;
        else                        //有多的不匹配的右括号
            a[rig]++;
    }
    LL res = 0;
    for(int i=1; i<=maxx; i++)
        res += a[i] * b[i];
    res += a[0] * a[0];
    cout<< res <<endl;

    return 0;
}

原文地址:https://www.cnblogs.com/WTSRUVF/p/9542807.html

时间: 2024-10-11 03:56:44

Bracket Sequences Concatenation Problem CodeForces - 990C(括号匹配水题)的相关文章

【CodeForces 990C】 Bracket Sequences Concatenation Problem

题目链接 luogu &  CodeForces 题目描述 A bracket sequence is a string containing only characters "(" and ")". A regular bracket sequence is a bracket sequence that can be transformed into a correct arithmetic expression by inserting charact

CodeForces 22D Segments 排序水题

题目链接:点击打开链接 右端点升序,取右端点 暴力删边 #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <iostream> #include <map> #include <set> #include <math.h> using namespace std; #define inf 10

Problem H: STL——括号匹配

Description 给出一堆括号,看其是否匹配,例如 ().()().(()) 这样的括号就匹配, )(.)()) 而这样的括号就不匹配 Input 每一行代表一组测试样例,每组测试样例只包含'('和')',样例长度不超过100个字符 Output 如果所有的括号都匹配,那么输出YES,否则输出NO Sample Input () )( Sample Output YES NO HINT 使用STL的stack容易实现. #include <iostream> #include <a

POJ 1141 Brackets Sequence (线性dp 括号匹配 经典题)

Brackets Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26407   Accepted: 7443   Special Judge Description Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular sequence. 2. If S is a re

POJ 1936 All in All 匹配, 水题 难度:0

题目 http://poj.org/problem?id=1936 题意 多组数据,每组数据有两个字符串A,B,求A是否是B的子串.(注意是子串,也就是不必在B中连续) 思路 设置计数器cnt为当前已匹配A的长度,明显在扫描B的过程中只需要记住cnt这一个状态. 扫描B,每次与A[cnt]匹配就将计数器增加1,cnt与A的长度一致时A就是B的子串. 感想 这道题也许可以用更复杂的方法. 代码 1 #include <cstdio> 2 #include <cstring> 3 #i

Match &amp; Catch CodeForces - 427D 后缀自动机水题

题意: 给出两个字符串a,b,求一个字符串,这个字符串是a和b的子串, 且只在a,b中出现一次,要求输出这个字符串的最小长度. 题解: 将a串放入后缀自动机中,然后记录一下每个节点对应的子串出现的次数 然后把b串取自动机中匹配 然后判断一下 1 #include <set> 2 #include <map> 3 #include <stack> 4 #include <queue> 5 #include <cmath> 6 #include &l

CodeForces 710A King Moves (水题)

题意:给定一个坐标,问你皇后有几个方向可以走. 析:直接格举那八个方向即可. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring&g

CodeForces 347A Difference Row (水题)

题意:给定 n 个数,让你找出一个排列满足每个数相邻作差之和最大,并且要求字典序最小. 析:这个表达式很简单,就是把重新组合一下,就成了x1-xn,那么很简单,x1是最大的,xn是最小的,中间排序就好. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <algorithm> #include <cstring> using namespace std;

CodeForces 347B Fixed Points (水题)

题意:给定 n 数,让你交换最多1次,求满足 ai = i的元素个数. 析:很简单么,只要暴力一遍就OK了,先把符合的扫出来,然后再想,最多只能交换一次,也就是说最多也就是加两个,然后一个的判,注意数组越界. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <algorithm> #include <cstring> using namespace st