T1
为什么要写这个题呢?
我只是想说:链表也能做!!
QAQAQ
可是……细节什么的考场写的好晕……
(其实我不想解释代码了QAQAQ
Codes:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 100000 + 10;
char s[N];
int ans,ans1,ans2;
int pre[N],nxt[N];
int main(){
//freopen("shower.in","r",stdin);
//freopen("shower.out","w",stdout);
scanf("%s",s + 1);
int len = strlen(s + 1);
for(int i = 1;i <= len;++ i){
pre[i] = i - 1;
nxt[i - 1] = i;
}
nxt[len] = len + 1;
pre[len + 1] = len;
if(s[1] != '(') ans ++;
if(s[len] != ')') ans ++;
s[1] = '(',s[len] = ')';
for(int i = 1;i < len;i = nxt[i]){
if(pre[i] == 0 && s[i] == ')'){
ans ++;
s[i] = '(';
}
if(nxt[i] == len + 1 && s[i] == '('){
ans ++;
s[i] = ')';
}
if(s[nxt[i]] == ')' && s[i] == '('){
nxt[pre[i]] = nxt[nxt[i]];
pre[nxt[nxt[i]]] = pre[i];
}
if(s[pre[i]] == '(' && s[i] == ')'){
nxt[pre[pre[i]]] = nxt[i];
pre[nxt[i]] = pre[pre[i]];
}
}
int sum = 0;
for(int i = 0;i < len + 1;i = nxt[i]){
if(s[nxt[i]] == '('){
sum ++;
}
}
cout << ans + (sum / 2) << '
';
return 0;
}