WA了N次,好不容易AC了,让我们来看看题
题目描述
有一种宝石串,由绿宝石和红宝石串成,仅当绿宝石和红宝石数目相同的时候,宝石串才最为稳定,不易断裂。安安想知道从给定的宝石串中,可以截取一段最长的稳定的宝石串,有多少颗宝石组成。请你帮助他。
绿宝石用‘G’表示,红宝石用‘R'表示。
输入
一行由G和R组成的字符串
输出
最长的稳定的宝石串有多少颗宝石组成
样例
输入数据 1
GRGGRG
输出数据 1
4
提示
RGGR为答案。
宝石数 ≤1000000
本来想直接暴力亿下的,结果0分(数据没洛谷水)
所以我又想前缀和的思想搞,结果15分超时
#include<bits/stdc++.h>
using namespace std;
string s;
int ans,a[1000001],sb=999999;
int main(){
cin>>s;
for(int i=1;i<=s.size();i++){
if(s[i-1]=='R')sb++;
else sb--;
if(!a[sb])a[sb]=i;
else ans=max(i-a[sb],ans);
if(sb==999999)ans=i;
}
cout<<ans;
return 0;
}
于是,我决定优化,变成了这样
#include<bits/stdc++.h>
using namespace std;
string s;
int ans,f[1000001],n=100001;
int main(){
cin>>s;
for(int i=1;i<=s.size();i++){
if(s[i-1]=='G')n--;
else n++;
if(f[n])ans=max(ans,i-f[n]);
else f[n]=i;
if(n==100001)ans=i;
}
cout<<ans;
return 0;
}
其实差别不大,但是差了85分~
结束撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 下期再见