好像也不算远古题目......
#include<bits/stdc++.h>
using namespace std;
string s;
int len,bj[50],lb=0,mt[500005],cnt[500005][30];
void ycl()
{
stack<int> stk;
for(int i=0;i<len;i++)
{
//cout<<i<<"\n";
if(s[i]=='(')
{
stk.push(i);
}
else if(s[i]==')')
{
mt[i]=stk.top();
//cout<<i<<" "<<mt[i]<<"\n";
stk.pop();
}
}
}
int main()
{
cin>>s;
len=s.length();
ycl();
for(int i=0;i<len;i++)
{
for(int j=0;j<26;j++)cnt[i][s[j]-'a']=cnt[i-1][s[j]-'a'];
if(s[i]>='a'&&s[i]<='z')
{
cnt[i][s[i]-'a']=cnt[i-1][s[i]-'a']+1;
}
//for(int j=0;j<len;j++)cout<<cnt[j][0]<<" ";
//cout<<"\n";
}
for(int i=0;i<len;i++)
{
if(s[i]>='a'&&s[i]<='z')
{
//cout<<s[i]-'a'<<" "<<bj[s[i]-'a']<<"\n";
if(bj[s[i]-'a']>0)
{
cout<<"No\n";
return 0;
}
bj[s[i]-'a']++;
}
else if(s[i]==')')
{
lb=mt[i];
//cout<<i<<" "<<lb<<"\n";
int t[30]={0};
for(int j=0;j<26;j++)
{
if(lb>0)t[j]=cnt[i][j]-cnt[lb-1][j];
else t[j]=cnt[i][j];
//cout<<j<<" "<<cnt[i][j]<<" "<<cnt[lb-1][j]<<" "<<t[j]<<"\n";
}
for(int j=0;j<26;j++)
{
bj[j]=max(0,bj[j]-t[j]);
//cout<<j<<" "<<bj[j]<<"\n";
}
}
}
cout<<"Yes\n";
return 0;
}
WA10个,AC14个