描述
给定一系列非负整数,求最长的连续子序列,使其和是7的倍数。
输入
第一行为正整数N(1<=N<=50000),接下来有N行,每行有一个非负整数,所有整数不大于10^6。
输出
如果存在连续子序列,其和为7的倍数,则输出子序列长度,如果不存在则输出0。
样例输入
7
3
5
1
6
2
14
10
样例输出
5
为使其和是7的倍数,我们在存数字的时候就可以直接存7的余数,输入的时候始终累加。
用l和r数组标记出现相同余数的初始位置和末位置,相减即可。
当余数为0时,需要增加一个,因为两头都可以取。
#include<stdio.h>
#include<string.h>
#include<stack>
#include<iostream>
using namespace std;
int a[50050];
int main()
{
int n,i,s=0,x,len,maxlen=-1;
int l[10],r[10];
//标记最早/最晚出现的位置
memset(l,-1,sizeof l);
memset(r,-1,sizeof r);
scanf("%d",&n);
l[0]=0;//划重点
for(i=0;i<n;i++)
{
scanf("%d",&x);
s=(s+x)%7;
a[i]=s;
if(l[a[i]]==-1)
l[a[i]]=i;
}
for(i=n-1;i>=0;i--)
{
if(r[a[i]]==-1)
r[a[i]]=i;
}
for(i=0;i<7;i++)
{
//遍历一次余数相同的位置
if(l[i]!=-1&&r[i]!=-1)
{
len=r[i]-l[i];
if(i==0)
len++;
if(len>maxlen)
maxlen=len;
}
}
printf("%d\n",maxlen);
}