小信的子数组为什么WA

#include <bits/stdc++.h>
using namespace std;
int sb(int n, int s, vector<int>a) {
    unordered_map<int, int> msp;
    msp[0] = -1;  
    int sum = 0;
    int len = -1;
    for (int i=0;i<n;i++) {
        sum+=a[i];
        int m=sum%s;
	if (msp.find(m)==msp.end()) {
            msp[m]=i;
        } else {
            len=max(len,i-msp[m]);
        }
    }
return len;
}

int main() {
    int t;
    cin>>t;
    while (t--) {
        int n,s;
        cin>>n>>s;
        vector<int>a(n);
        for (int i=0;i<n;i++) {
            cin>>a[i];
        }
	int r=sb(n,s,a);
    cout <<r<<endl;
    }
    return 0;
}


1 个赞

你的思路说一下

1 个赞

前缀和+模运算

1 个赞

我是前缀和之后直接for循环搜

2 个赞

???

1 个赞
for(int i=0;i<=n;i++)
{
        //判断,找到后就break
}
for(int i=n;i>=1;i--)
{
        //判断,找到后就break
}
1 个赞

前面就前缀和

1 个赞

再详细一点

#include<bits/stdc++.h>
using namespace std;
int T,n,s;
int main()
{
	cin>>T;
	while(T--)
	{
		cin>>n>>s;
		int a[n+1]={0},b[n+1]={0},ans=INT_MAX;
		for(int i=1;i<=n;i++)输入
		for(int i=1;i<=n;i++)前缀和数组
		for(int i=0;i<=n;i++)
		{
			if(判断条件)
			{
				ans=min(ans,n-i);
				break;
			}
		}
		for(int i=n;i>=1;i--)
		{
			if(判断条件)
			{
				ans=min(ans,i);
				break;
			}
		}
		if(判断有没有答案)cout<<-1<<endl;
		else cout<<ans<<endl;
	}
	return 0;
}
2 个赞