zoukankan      html  css  js  c++  java
  • 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/ 希望所写的文章对您有帮助。
  • 相关阅读:
    Windows性能计数器应用
    Azure Oracle Linux VNC 配置
    Azure 配置管理系列 Oracle Linux (PART6)
    Azure 配置管理系列 Oracle Linux (PART5)
    Azure 配置管理系列 Oracle Linux (PART4)
    Azure 配置管理系列 Oracle Linux (PART3)
    Azure 配置管理系列 Oracle Linux (PART2)
    vagrant多节点配置
    docker基本操作
    LINUX开启允许对外访问的网络端口命令
  • 原文地址:https://www.cnblogs.com/qieqiemin/p/11041472.html
Copyright © 2011-2022 走看看