題目鏈結
題意:給出n個字串只包含「()」,問n個字串可以任意順序連線,最多有多少個括號匹配?
解法:首先統計單個字串中已經匹配的括號。
對於剩下的不匹配字串有三種情況:
( 左括號多於右括號
)( 左括號等於右括號
) 左括號小於右括號
排序:按照第一類、第二類和第三類字串相對順序擺放。具體第一類:對於同為第一類之間的排序規則為右括號更少的放前面。具體第三類:左括號多的放前面。
//#include#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll ;
#define int ll
#define mod 100
#define gcd(m,n) __gcd(m, n)
#define rep(i , j , n) for(int i = j ; i <= n ; i++)
#define red(i , n , j) for(int i = n ; i >= j ; i--)
#define me(x , y) memset(x , y , sizeof(x))
//int lcm(int a , int b)
//ll quickpow(ll a , ll b)return ans;}
//int euler1(int x)if(x>1)ans-=ans/x;return ans;}
//const int n = 1e7+9; int vis[n],prime[n],phi[n];int euler2(int n)for(int j=1;j#define fi first
#define se second
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define pb push_back
#define mp make_pair
#define all(v) v.begin(),v.end()
#define size(v) (int)(v.size())
#define cin(x) scanf("%lld" , &x);
const int n = 1e6+9;
const int maxn = 1e5+9;
const double esp = 1e-6;
char s[maxn];
int cnt ;
struct nodea[maxn];
bool cmp(node a , node b)
if(a.l < a.r && b.l >= b.r)
if(a.l >= a.r && b.l >= b.r)
if(a.r >= a.l && b.r >= b.l)//同樣是右括號多,左括號更多的放前面
return a.l > b.l;
}void solve()elseelse}}
}sort(a+1 , a+1+n , cmp);
int l = 0;
rep(i , 1 , n)
cout << ans << endl;
}signed main()
括號匹配 棧
蒜頭君在紙上寫了乙個串,只包含 和 乙個 能唯一匹配乙個 但是乙個匹配的 必須出現在 之前。請判斷蒜頭君寫的字串能否括號完全匹配,如果能,輸出配對的括號的位置 匹配的括號不可以交叉,只能巢狀 一行輸入乙個字串只含有 和 輸入的字串長度不大於 50000 如果輸入括號不能匹配,輸出一行 no 否則輸出...
棧括號匹配
input 輸入包括多組測試資料,每組資料是乙個字串,字串只包含 等字元。output 對於每組資料輸出 yes 表示當前字串中的括號是匹配的,否則輸出 no 不包括引號 sampleinput sampleoutput yes no題解 利用棧 includeusing namespace std...
棧 括號匹配
括號匹配,棧的經典題目,將左括號入站,然後遇到右括號就詢問棧頂是不是與之相匹配的左括號,如果是,出棧,不是,匹配失敗。注意這個題目是多組輸入,而且包含空格,所以需要用 gets讀入。include include include include using namespace std typedef...