「傘を」小さな世界の情報セキュリティを演奏し、学生を与えるために、VIPKIDは、3次元のセキュリティ防衛システム、7 \回確立されたデータの業界最高レベルの継続的なセキュリティ監視と緊急対応や他の多くのリンケージ、247×24時間セキュリティ規格。VIPKID業界は、ISO国際的な情報セキュリティシステムの認証、保護3認定の教育、企業の公開情報セキュリティレベルの省を通じて唯一の産業である、ことを言及する価値があります。
今、セキュリティの防衛システムに小さな問題を検出し、あなたは私たちが今、情報セキュリティに小さな参加者を守るために協力しましょうこれは、「前任者と後継者」に、このセクションを解決する必要があります!質問を参照してください:
異なる正規ブラケットSSの二つの等しい長さの配列については、TTは、それらの間の大小関係は、それらの辞書式順序の大小関係に相当する定義します。
正当な括弧系列SSを考えると、SSは前任者と後継者を得ました。
SS前駆体:SSの最大よりも全て小さいの文字列。
その後のSS:SS最小ストリームよりも、すべて大きいです。
データは、前駆体および後継者の存在を保証します。
書式入力し
、正当な括弧系列SSのラインを。
出力フォーマット
有効なシーケンスブラケット事前の最初の行のは、前駆体を発現しました。
正当括弧配列SUFの2行は、後継者を表現しました。
データスケール
0 <| S | \当量10000000 <| S |≤1000000
サンプル入力コピー
(()())()((()))()
サンプル出力コピー
(()())()((())())
(()())()((()()))
質問の意味:アイデア:前駆体:ことを後方に位置posを検索してみてくださいSTR [POS] == '(' && STR [POS-1] ==「)、 POS-1の前に無傷で、すべての文字、交換POSそしてPOS-1できるだけ前方の合法性を確保する上で文字、POS後、位置、そのように閉じ括弧
後輪駆動:==後方のでSTR [POS]を位置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';
}
}
}