#hASHybttg020107. 1461:Beads
1461:Beads
好的,这是整理好的题面,格式清晰。
题目描述
Zxl 制造一条项链,她有一长条珊瑚珠子(长度为 ( n )),每个珠子有颜色 ( a_i )。
她有一个机器,能把珠子切成很多块(子串),每块有 ( k )(( k > 0 ))个珠子。
如果珠子的长度不是 ( k ) 的倍数,最后不足 ( k ) 个珠子的块就不要了(浪费掉)。
Zxl 想要得到尽可能多的不同的子串(子串可以反转,即子串 ((1,2,3)) 和 ((3,2,1)) 视为相同)。
写一个程序,为 Zxl 决定最适合的 ( k ),使得能得到最多的不同子串,并输出:
- 最大不同子串个数;
- 能获得最大值的 ( k ) 的个数;
- 所有这样的 ( k )(从小到大)。
输入格式
第一行一个整数 ( n ),代表珠子的长度。
第二行 ( n ) 个整数 ( a_i )(( 1 \le a_i \le n )),表示珠子颜色。
输出格式
第一行两个整数:第一个是最大不同的子串个数,第二个是能获得最大值的 ( k ) 的个数。
第二行输出所有能获得最大值的 ( k ),用空格隔开(按升序)。
数据范围
( n \le 200000 )
输入样例
21
1 1 1 2 2 2 3 3 3 1 2 3 3 1 2 2 1 3 3 2 1
输出样例
6 1
2
样例解释
珠子的颜色序列为: ( 1,1,1,2,2,2,3,3,3,1,2,3,3,1,2,2,1,3,3,2,1 )
分析
对于每个 ( k ),将序列切成若干个长度为 ( k ) 的块(最后不足 ( k ) 的丢弃),每个块可以正向或反向(两者视为相同)。统计不同的块的数量。
题目举例(与输入一致):
- ( k=1 ):有 3 个不同的子串:(1), (2), (3)
- ( k=2 ):有 6 个不同的子串:(1,1), (1,2), (2,2), (3,3), (3,1), (2,3)
- ( k=3 ):有 5 个不同的子串:(1,1,1), (2,2,2), (3,3,3), (1,2,3), (3,1,2)
- ( k=4 ):有 5 个不同的子串:(1,1,1,2), (2,2,3,3), (3,1,2,3), (3,1,2,2), (1,3,3,2)
其中最大不同子串个数为 6,此时 ( k = 2 ),且只有这一个 ( k ) 能达到 6。
输出:
6 1
2