【洛谷】P2697题解

大家好我又来发题解了,,,

这道题比较难,我用的是暴力(剪枝)+前缀和维护,每个点都可以到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; }

猜你喜欢

转载自www.cnblogs.com/liuzongxin/p/10359937.html