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


    为了给全球小学员打起信息安全“保护伞”,VIPKID 还建立了一套立体化的安全防御体系,7 imes 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), '', 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]='';
    	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]='';
    	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 == '
    ');
        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';
            }
        }
    }
    
    
    
    本博客为本人原创,如需转载,请必须声明博客的源地址。 本人博客地址为:www.cnblogs.com/qieqiemin/ 希望所写的文章对您有帮助。
  • 相关阅读:
    Linux 下curl模拟Http 的get or post请求
    ShopNC学习笔记(转)
    (转) shopnc数据库操作
    Mysql开发规范
    长连接、短连接、长轮询和WebSocket
    一个支付宝没有安装app时看不到web网页,无法支付的问题
    MVVM设计模式
    c中的scanf和printf
    import和class关键字的区别
    oc中的注释
  • 原文地址:https://www.cnblogs.com/qieqiemin/p/11041472.html
Copyright © 2020-2023  润新知