刚开始以为之前做过,还很不屑一顾,没想到这道题目升级了,从一维升级为二维。
主要的思路就是 两个字符串如果可以拼成一个expression,
要么这两个字符串是expression,
要么就是一个字符串左括号不匹配数等于另一个字符串的有括号不匹配数
注意需要排除 类似“)(”这种字符串
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<string> #include<vector> #include<queue> #include<map> #include<stack> #include<unordered_map> #define DEBUG(x) cout<<#x<<" = "<<x<<endl typedef long long ll; using namespace std; const int MAXN=3e5+10; ///i个左括号不匹配的字符串个数 ll ln[MAXN]; ll rn[MAXN]; pair<char,int> noMatchNum(string s,int n) { vector<char>st; st.push_back(s[0]); for(int i=1;i<n;i++){ if(s[i]=='(')st.push_back(s[i]); else if(st.back()=='(')st.pop_back(); else st.push_back(s[i]); } char rc; if(st.size()!=0)rc=st[0]; else rc='('; int rs=st.size(); for(int i=1;i<st.size();i++){ if(st[i-1]!=st[i]){ rs=-1; break; } } return make_pair(rc,rs); } int main() { // freopen("in.txt","r",stdin); int n; scanf("%d",&n); ll nexp=0; while(n--){ string s; cin>>s; pair<char,int> nmn= noMatchNum(s,s.size()); if(nmn.second==-1)continue; else if(nmn.second==0)nexp++; else{ if(nmn.first=='(')ln[nmn.second]++; else rn[nmn.second]++; } } ll ans=nexp*nexp; for(int i=1;i<=MAXN;i++){ ans+=ln[i]*rn[i]; } cout<<ans<<endl; }