题目描述:
序列中任意个连续的元素组成的子序列被称为该序列的字串
现在给你一个序列P和一个整数K,询问元素和是K的倍数的子串的最大长度
比如序列{1,2,3,4,5},给定的整数K为5,其中满足条件的子串为{5}、{2,3}、{1,2,3,4}
、{1,2,3,4,5},那么答案就为5,因为最长的子串为{1,2,3,4,5};
如果满足条件的子串不存在,就输出0
输入:
第一个含一个整数N,1<=N<=10^5
第二行包含N个整数Pi,Pi表示序列P第i个元素的值。0<=Pi<=10^5
第三行包含一个整数K,1<=K<=10^5
解题思路:
这里提供一种O(N)复杂度的解题方案。
1、就是首先获得数组的累加和,即sum_s。(例如,[0,1,2,3,4]的累加和为[0,1,3,6,10]),这样做的目的,其实为了得到,子序列的和,即前面两个数的和为(3-0),第2个数到第三个数的和为6-1=(2+3)
2、然后,我们要求减少算法的复杂度,那么我们可以先对长度较长的子序列判断它是否是K的整数倍。因此,我们首先取出子序列首尾的下标及其长度,并按长度排序。
3、对排好序的子序列一一遍历,只要出现满足情况的子序列,即为最长子序列。
代码实现:
from itertools import combinations
n=int(raw_input())
s=[int(i) for i in raw_input().split()]
k=int(raw_input())
sum_s=[0]
lingshi=0
for i in s:
lingshi+=i
sum_s.append(lingshi)
#取出子序列首尾的下标及其长度
sort_list=map(lambda x :[x[0],x[1],abs(x[0]-x[1])],list(combinations(range(len(sum_s)),2)))
#按长度排序
sort_list=sorted(sort_list, key=lambda x:x[2],reverse=True)
for x in sort_list:
if x[0]>x[1]:
if (sum_s[x[0]]-sum_s[x[1]])%k==0:
print x[0]-x[1]
flag=0
break
if x[1]>x[0]:
if (sum_s[x[1]]-sum_s[x[0]])%k==0:
print x[1]-x[0]
flag=0
break
if flag!=0:
print 0