码迷,mamicode.com
首页 > 其他好文 > 详细

2019 计蒜之道 复赛 E. 撑起信息安全“保护伞” (贪心,构造,规律)

时间:2019-06-17 18:58:25      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:cpp   (())   防御   长度   最大的   字典   NPU   有关   教育   

为了给全球小学员打起信息安全“保护伞”,VIPKID 还建立了一套立体化的安全防御体系,7 \times 247×24 小时持续安全监控与应急响应等多项联动,具备业界最高级别的数据安全保护标准。值得一提的是,VIPKID 也是行业业内唯一通过 ISO 国际信息安全体系认证、公安部信息安全等级保护三级认证的教育企业。

现在安全防御体系就检测到了一个小问题,需要你来帮忙解决其中有关“前驱与后继”的这一部分,让我们一起来守护小学员们的信息安全吧!请看题:

对于两个长度相等的不同的合法括号序列 SS,TT,定义他们之间的大小关系等同于他们字典序的大小关系。

给定一个合法的括号序列 SS,求出 SS 的前驱与后继。

SS 的前驱:所有小于 SS 的串中最大的一个。

SS 的后继:所有大于 SS 的串中最小的一个。

数据保证存在前驱与后继。

输入格式
一行一个合法括号序列 SS。

输出格式
第一行一个合法括号序列 pre,表示前驱。

第二行一个合法括号序列 suf,表示后继。

数据规模
0< | S | \leq 10000000<∣S∣≤1000000

样例输入 复制
(()())()((()))()
样例输出 复制
(()())()((())())
(()())()(()(()))

题意:

思路:
前驱 :找一个尽量靠后的位置pos,使得str[pos]==‘(‘ &&str[pos-1]==‘) ,然后pos-1之前的所有字符不变,交换pos和pos-1的字符,然后pos之后的位置,在保证合法的前提下尽可能的让右括号靠前

后驱: 找一个尽量靠后的位置pos,使其str[pos]==‘(‘&&str[pos+1]==‘)‘ ,并且交换这两个位置得到的括号后序列依然合法。则让pos 之前的位置都保持不变,交换pos和pos+1的字符。然后pos+1之后的位置,在保证合法的前提下尽量让左括号靠前。

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
char s[maxn];
int len;
char pre[maxn];
char Next[maxn];
void solvepre()
{
    int pos;
    for(int i=len-1;i>=1;--i)
    {
        if(s[i]=='('&&s[i-1]==')')
        {
            pos=i;
            break;
        }
    }
    // )(
    int num=len/2;
    int cnt=0;
    rep(i,0,pos-1)
    {
        if(s[i]=='(')
            cnt++;
        else
            cnt--;
        pre[i]=s[i];
    }
    pre[pos-1]='(';
    pre[pos]=')';
    repd(i,pos+1,len-1)
    {
        if(cnt)
        {
            cnt--;
            pre[i]=')';
        }else
        {
            pre[i]='(';
            cnt++;
        }
    }
    pre[len]='\0';
    cout<<pre<<endl;
}

void solvenext()
{
    //()
    //)(
    int pos;
    int num=0;
    rep(i,0,len)
    {
        if(num>=1&&s[i]=='('&&s[i+1]==')')
        {
            pos=i;
        }
        if(s[i]=='(')
        {
            num++;
        }else
        {
            num--;
        }
    }
    swap(s[pos],s[pos+1]);
    int cnt=0;
    repd(i,0,pos+1)
    {
        if(s[i]=='(')
        {
            cnt++;
        }
    }
    cnt=len/2-cnt;
    repd(i,pos+2,len-1)
    {
        if(cnt>0)
        {
            s[i]='(';
            cnt--;
        }else
        {
            s[i]=')';
        }
    }
    s[len]='\0';
    cout<<s<<endl;
}
int main()
{
    //freopen("D:\\code\\text\\input.txt","r",stdin);
    //freopen("D:\\code\\text\\output.txt","w",stdout);
    gbtb;
    cin>>s;
    len=strlen(s);
    solvepre();
    solvenext();
    
    
    return 0;
}

inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}

2019 计蒜之道 复赛 E. 撑起信息安全“保护伞” (贪心,构造,规律)

标签:cpp   (())   防御   长度   最大的   字典   NPU   有关   教育   

原文地址:https://www.cnblogs.com/qieqiemin/p/11041472.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!