元素和是K的倍数的子串的最大长度

转载 2018年04月15日 18:23:33
链接:https://www.nowcoder.com/acm/contest/91/L
来源:牛客网
代码参考转载地址:https://blog.csdn.net/yoomiky/article/details/77776359
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

给一个数组 a,长度为 n,若某个子序列中的和为 K 的倍数,那么这个序列被称为“K 序列”。现在要你 对数组 a 求出最长的子序列的长度,满足这个序列是 K 序列。 

输入描述:

第一行为两个整数 n, K, 以空格分隔,第二行为 n 个整数,表示 a[1] ∼ a[n],1 ≤ n ≤ 105 , 1 ≤ a[i] ≤ 109 , 1 ≤ nK ≤ 107

输出描述:

输出一个整数表示最长子序列的长度 m


PS:题或者数据有问题,子序列不是子串,但是用求最长子串的算法依然可以过。


#include<iostream>
#include<vector>
using namespace std;
/*思路,扫描序列对K取余求和,记录每个余数第一次出现的位置。
 *当该余数重复出现时,与第一次出现的位置做差求长度。
 *余数0出现的第一个位置为0*/
int Len(vector<int> arr, int N, int K)
{
    int result = 0;
    vector<int> Fis(K);
    for (int i = 0; i < K; i++)
        Fis[i] = -1;

    Fis[0] = 0;//小坑,注意细节

    int mod = 0;
    for (int i = 0; i < N; i++)
    {
        mod = (mod + arr[i]) % K;
        if (Fis[mod] == -1)//记录该余数第一次出现的位置
            Fis[mod] = i+1;//按照规律是不需要加1的。
        else
            result = result < (i+1 - Fis[mod]) ? (i+1 - Fis[mod]) : result;//当相同余数出现时,做差求长度,保留最大子串长度。
    }

    return result;
}

int main()
{
    std::ios::sync_with_stdio(false);
    int N,K;
    cin>>N>>K;
    vector<int> arr(N);
    for (int i = 0; i < N; i++)
    {
        cin>>arr[i];
    }
    cout << Len(arr, N, K)<<endl;

    return 0;
}

MFC架构下的DirectX8

MFC架构下的DirectX8第一章 MFC框架(DX8MFC)这里的MFC框架指的是一个符合游戏开发应用的框架,当然你也可以写一个符合你要求的MFC框架。如果你对MFC比较熟悉的话可以直接从第二章开...
  • ghj1976
  • ghj1976
  • 2001-01-15 16:30:00
  • 1659

求数组元素和是K的倍数的子串的最大长度

序列中任意个连续的元素组成的子序列称为该序列的子串。 现在给你一个序列P和一个整数K,询问元素和是K的倍数的子串的最大长度。 比如序列【1,2,3,4,5】,给定的整数K为 5,其中满足条件的子串为{...
  • u010002184
  • u010002184
  • 2017-09-01 13:06:07
  • 1810

k的倍数(同模相减-美团笔试编程题)

问题描述: 序列中任意个连续的元素组成的子序列成为该序列的子串。现在给你一个序列p和一个整数k,询问元素和是k的倍数的子串的最大长度。比如序列[1,2,3,4,5],给定的k为5,其中满足条件的串子串...
  • carson0408
  • carson0408
  • 2017-08-31 23:03:10
  • 1582

数组中子数组等于k的最大长度

题目:假定有数组arr[4]={3,1,4,7}, 求出数组中子数组中等于12的最大长度。基本思想创建一个hash表,其key等于数组中遍历过的数的和,其value等于当前遍历的数在数组中的下标。用s...
  • u013616945
  • u013616945
  • 2017-08-24 10:39:37
  • 227

美团点评秋招编程题

美团点评2017秋招
  • peaktravel
  • peaktravel
  • 2017-09-03 13:04:07
  • 104

K的倍数 (美团2018内推C++编程题)

前两天做了美团的C++笔试题,自己也AC了,看了下网上的代码,感觉都是额外建个数组,空间复杂度比较高,于是把自己的空间复杂度是O(1)的代码贴上来,时间复杂度跟AC的都差不多。不多说,上程序。 ...
  • feng9508
  • feng9508
  • 2017-09-04 23:39:32
  • 78

hdu 5671 String(求有多少个子串,包含有至少k(1≤k≤26)个不同的字母)

题意: 有一个 10≤长度≤1,000,000 的字符串,仅由小写字母构成。求有多少个子串,包含有至少k(1≤k≤26)个不同的字母? 思路: 如果l,r中正好包含有k个不同的子串,...
  • acm_fighting
  • acm_fighting
  • 2016-04-29 23:03:49
  • 603

20170831美团笔试:长度为n的数组中最长的和为K的倍数的连续子数组

看到这道题,第一个想法是遍历,从n个数求和,再到n-1个数求和(这里需要遍历)。再到1个数,没有k的倍数则输出0。但是一看数量级10^5,O(n^2)的复杂度肯定超了,于是想到了以前项目里用到的滑窗法...
  • qq_25147897
  • qq_25147897
  • 2017-08-31 21:49:21
  • 565

ZOJ 1569 对于给定序列,问有多少子序列的和是m倍数

题目连接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=569 题目的意思很明了,就不翻译了。。哥也是没有过四级的人啊。。。 这...
  • xieshimao
  • xieshimao
  • 2011-05-17 22:03:00
  • 1588

【数据结构与算法】小于等于k的最大连续子序列和

使用Kadane算法可以在On内得到最大连续子序列和。如果要求得到和不超过k,那么该如何解决? 首先要看能不能继续使用Kadane算法。答案是不能。回顾Kadane,Kadane中使用dp[i]存最后...
  • u010900754
  • u010900754
  • 2017-03-05 05:53:48
  • 1033
收藏助手
不良信息举报
您举报文章:元素和是K的倍数的子串的最大长度
举报原因:
原因补充:

(最多只允许输入30个字)