大家好我又来发题解了,,,
这道题比较水难,我用的是暴力(剪枝)+前缀和维护,每个点都可以到3ms左右。
好的话不多说我们来分析可以怎样剪枝:(忙人请跳过)
for(int j=i+maxx+1;j<=n;j+=2)
这段代码有何用?
- 从i+maxx+1开始循环。
那么前面的段(我们不管它是否匹配)都没有当前的maxx大。
- j+=2
只有偶数个才有可能匹配。这一点很容易想到的哦~
还有:
n=a.length();
for(int i=0;i<n;i++)
这里为什么不直接
for(int i=0;i<a.length();i++)
因为循环时如果像后者这样写的话,每循环一次就会调用一次length函数,很耗代码量运行时间滴!
其实还有很多地方可以剪的,但是我太弱了,于是就没剪
贴上蒟蒻香喷喷的代码~
扫描二维码关注公众号,回复:
5157698 查看本文章
# include <bits/stdc++.h>
using namespace std; int n,f[1000434],maxx; string a; int main() { ios::sync_with_stdio(false);//让cin变快的黑科技*1 cin.tie(0);//让cin变快的黑科技*2 cin>>a; n=a.length(); for(int i=0;i<n;i++)//剪枝*1 if(a[i]=='G')f[i+1]=f[i]-1; else f[i+1]=f[i]+1;//为了让串均衡(为0)所以遇到G就-1反之+1 maxx=0;//一开始没有符合要求的串 for(int i=1;i<=n;i++) for(int j=i+maxx+1;j<=n;j+=2)//剪枝*2 if(f[j]-f[i-1]==0)maxx=max(maxx,j-i+1); cout<<maxx; return 0; }