题意:N个数,找出其中最大连续子段和%M=0。
分析:O(n)求出%M=i的最大下表和最小下表,算是哈希吧。
Code:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#include <map>
#include <set>
#define eps 1e-7
#define LL long long
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=100005;
int f[maxn],pmin[maxn],pmax[maxn];
int n,m;
int main()
{
while(scanf("%d %d",&n,&m)==2){
f[0]=0;
for(int i=0;i<m;i++){
pmin[i]=inf;
pmax[i]=-1;
}
int x;
for(int i=1;i<=n;i++){
scanf("%d",&x);
f[i]=(f[i-1]+x)%m;
f[i]=(f[i]+m)%m;
pmin[f[i]]=Min(pmin[f[i]],i);
pmax[f[i]]=Max(pmax[f[i]],i);
}
int ans=pmax[0];
for(int i=1;i<m;i++) ans=Max(ans,pmax[i]-pmin[i]);
printf("%d\n",ans);
}
return 0;
}