ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AcWing 2003. 找到牛!

2022-05-28 22:01:54  阅读:133  来源: 互联网

标签:找到 ll ++ 2003 int ans idxr include AcWing


题意

给定一个括号字符串,连续的两个'('可以表示牛的前脚,连续的两个')'可以表示牛的后脚,前脚必须在后脚的左侧,求牛的可能位置有几个,牛的可能位置由他的前后脚表示。

数据范围

\(1 \le N \le 50000\)

解题思路

  • 正解是\(O(n)\)的做法,记一下当前位置及以前的"(("的对数,判断当前位置是否为"))",如果是"))",答案加上之前的"(("数量。

  • 我的做法是处理出来所有的"(("和"))"的位置,前者是记录第二个字符的位置,后者记录第一个字符的位置,然后枚举左括号的位置,二分查找可以与之匹配的右括号数量,加到答案上。但该方法复杂度为\(O(n\log{n})\),且边界容易出错。

代码

方法一:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 5e4 + 10;

char s[N];

int main()
{
    scanf("%s", s);
    int n = strlen(s);
    
    int cnt = 0, ans = 0;
    for(int i = 1; i < n; i ++){
        if(s[i] == '(' && s[i - 1] == '(') cnt ++;
        if(s[i] == ')' && s[i - 1] == ')') ans += cnt;
    }
    printf("%d\n", ans);
    
    return 0;
}

方法二:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 5e4 + 10;

char s[N];
int l[N], r[N];

int main()
{
    scanf("%s", s);
    int n = strlen(s);
    
    int idxl = 0, idxr = 0;
    for(int i = 1; i < n; i ++){
        if(s[i] == '(' && s[i - 1] == '(') l[idxl ++] = i;
    }
    for(int i = n - 2; i >= 0; i --){
        if(s[i] == ')' && s[i + 1] == ')') r[idxr ++] = i;
    }
    sort(r, r + idxr);
    
    int ans = 0;
    for(int i = 0; i < idxl; i ++){
        int x = l[i];
        int ll = 0, rr = idxr - 1;
        while(ll < rr){
            int mid = ll + rr + 1 >> 1;
            if(r[mid] <= x) ll = mid;
            else rr = mid - 1;
        }
        if(r[ll] > x) ans += idxr - ll;
        else ans += idxr - ll - 1;
    }
    printf("%d\n", ans);
    
    return 0;
}

标签:找到,ll,++,2003,int,ans,idxr,include,AcWing
来源: https://www.cnblogs.com/bxhbxh/p/16322108.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有