题解 P3131 【[USACO16JAN]子共七Subsequences Summing to Sevens】
前缀和,
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a,s,l[]={0,-1,-1,-1,-1,-1,-1},r[7],ans; //s是前缀和,l[i]存%7为i的最小l-1,r[i]存%7为i的最大r,-1代表没有%7为i的前缀和,当有任意前缀和s[x]%7等于0时,最长区间长度就是x
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&a);
s=(s+a)%7;
if(l[s]==-1)l[s]=i;
r[s]=i;
}
for(int i=0;i<7;++i)if(l[i]!=-1)ans=max(ans,r[i]-l[i]);
printf("%d",ans);
}