P3131 前缀和的题


#include 

using namespace std;

long long s[50007];
int pre[7],suf[7];

int main(){
    int n;
    cin>>n;
    cin>>s[1];
    for(int i = 2;i<=n;i++){
        int tmp;
        cin>>tmp;
        s[i] = s[i-1] + tmp;
    }
    memset(pre,-1,sizeof(pre));
    memset(suf,-1,sizeof(suf));
    for(int i = 0;i<=n;i++){
        if(!~pre[s[i]%7]) pre[s[i]%7] = i;///0~6余数的最先出现位置
        if(!~suf[s[n-i]%7]) suf[s[n-i]%7] = n - i;///0~6余数的最后出现位置
        ///O(n),能找到端点为同一个余数的最大区间
        ///由于要找到余数为0的区间,则端点一定是余数相同的,所以先找到7个余数的端点的最大区间,然后再求它们最大区间的最大值即可
    }
    int ans = 0;
    for(int i = 0;i<=6;i++){
        ans = max(ans,suf[i] - pre[i]);
    }
    cout<