洛谷 P2697 宝石串 题解

P2697 宝石串

题目链接

P2697 宝石串

题解

其实这道题是一道非常水的差值前缀和的题目,当然DP也可以。

我们把G看成+1.把R看成-1,那么a[i[表示R和G的差值。a[i]有正有负。

我们枚举每一个i,找到最早的和a[i]相同的数的位置j,那么i和j就可以形成一个串

我们只要找到最大的i和j差值就好了。

用p记下每个a[i]最早的时间,因为a[i]有正有负,所以我用了map

#include<bits/stdc++.h>
using namespace std;
int ans,n,a[1000005];
char s[1000005];
map<int,int> p;
int read(){
    int ret=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
    while(ch<='9'&&ch>='0')ret=ret*10+ch-'0',ch=getchar();
    return ret*f; 
}
int main(){
    freopen("NOIP.in","r",stdin);
     freopen("NOIP.out","w",stdout);
     scanf("%s",s+1);
     n=strlen(s+1);
     for(int i=-n;i<=n;i++)p[i]=1e6;
    for(int i=1;i<=n;i++){
        if(s[i]=='G')a[i]=a[i-1]+1;
         else a[i]=a[i-1]-1;
    }
    for(int i=0;i<=n;i++){
        ans=max(ans,i-p[a[i]]);
        p[a[i]]=min(p[a[i]],i);
    }
    printf("%d",ans);
    return 0;
} 

肯定没有相同解法,嘿嘿嘿ZZZ

猜你喜欢

转载自www.cnblogs.com/booksBlog/p/10708483.html
今日推荐