求m个相邻串珠上,颜色出现重复的个数
作为一个手串艺人,有金主向你订购了一条包含n个杂色串珠的手串——每个串珠要么无色,要么涂了若干种颜色。为了使手串的色彩看起来不那么单调,金主要求,手串上的任意一种颜色(不包含无色),在任意连续的m个串珠里至多出现一次(注意这里手串是一个环形)。手串上的颜色一共有c种。现在按顺时针序告诉你n个串珠的手串上,每个串珠用所包含的颜色分别有哪些。请你判断该手串上有多少种颜色不符合要求,即询问有多少种颜色在任意连续m个串珠中出现了至少两次。
输入描述:
第一行输入n,m,c三个数,用空格隔开。(1<=n<=10000, 1<=m<=1000, 1<=c<=50) 接下来n行每行的第一个数num_i(0<=num_i<=c)表示第i颗珠子有多少种颜色。接下来依次读入num_i个数字,每个数字x表示第i颗珠子上包含的颜色(1<=x<=c)输出描述:
一个非负证书,表示该手链上有多少种颜色不符需求。示例:
5 2 3
3 1 2 3
0
2 2 3
1 2
1 3说明
第一种颜色出现在第1颗串珠,与规则无冲突。
第二种颜色分别出现在第1,3,4颗串珠,第3颗与第4颗串珠相邻,所以不合要求。
第三种颜色分别出现在第1,3,5颗串珠,第5颗串珠的下一个是第1颗,所以不合要求。
总计有2种颜色的分布式有问题的。
这里第2颗串珠是透明的。
解决思路
第一种
按照说明的方法来 求出每种颜色出现在那些串珠的位置上,对不符合要求的串珠作统计:
第二种
滑动窗口 第一次读取前m行,记录每种颜色出现的次数,将不满足要求的颜色计数,通过过的颜色不再进行运算;然后往下读取,进行n-1次,将原来m行中最上面有的颜色的计数值减1,再将最新的一行中的颜色计数加1,重复第一步的检测: