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