Abelian Period

Accepts: 288
Submissions: 984
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 262144/131072 K (Java/Others)
问题描述
设SSS是一个数字串,定义函数occ(S,x)occ(S,x)occ(S,x)表示SSS中数字xxx的出现次数。

例如:S=(1,2,2,1,3),occ(S,1)=2,occ(S,2)=2,occ(S,3)=1S=(1,2,2,1,3),occ(S,1)=2,occ(S,2)=2,occ(S,3)=1S=(1,2,2,1,3),occ(S,1)=2,occ(S,2)=2,occ(S,3)=1。

如果对于任意的iii,都有occ(u,i)=occ(w,i)occ(u,i)=occ(w,i)occ(u,i)=occ(w,i),那么我们认为数字串uuu和www匹配。

例如:(1,2,2,1,3)≈(1,3,2,1,2)(1,2,2,1,3)\approx(1,3,2,1,2)(1,2,2,1,3)≈(1,3,2,1,2)。

对于一个数字串SSS和一个正整数kkk,如果SSS可以分成若干个长度为kkk的连续子串,且这些子串两两匹配,那么我们称kkk是串SSS的一个完全阿贝尔周期。

给定一个数字串SSS,请找出它所有的完全阿贝尔周期。
输入描述
输入的第一行包含一个正整数T(1≤T≤10)T(1\leq T\leq10)T(1≤T≤10),表示测试数据的组数。

对于每组数据,第一行包含一个正整数n(n≤100000)n(n\leq 100000)n(n≤100000),表示数字串的长度。

第二行包含nnn个正整数S1,S2,S3,...,Sn(1≤Si≤n)S_1,S_2,S_3,...,S_n(1\leq S_i\leq n)S​1​​,S​2​​,S​3​​,...,S​n​​(1≤S​i​​≤n),表示这个数字串。
输出描述
对于每组数据,输出一行若干个整数,从小到大输出所有合法的kkk。
输入样例
2
6
5 4 4 4 5 4
8
6 5 6 5 6 5 5 6
输出样例
3 6
2 4 8

思路:枚举n的因子,然后我们去检验这个是否符合就可以了;

  1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<queue>
6 #include<set>
7 #include<math.h>
8 #include<map>
9 using namespace std;
10 typedef long long LL;
11 int ans[100005];
12 int cnt[100005];
13 int cnt2[100005];
14 int tx[100005];
15 int ask[100005];
16 int main(void)
17 {
18 int T;
19 scanf("%d",&T);
20 while(T--)
21 {
22 int n;
23 scanf("%d",&n);
24 int i,j;
25 for(i = 1; i <= n; i++)
26 {
27 scanf("%d",&ans[i]);
28 }
29 int cn = 0;
30 for(i = 1; i <= sqrt(1.0*n); i++)
31 {
32 int v = 0;
33 if(n%i==0)
34 {
35 int k = n/i;
36 for(j = 1; j <= i; j++)
37 {
38 if(!cnt[ans[j]])
39 {
40 tx[v++] = ans[j];
41 }
42 cnt[ans[j]]++;
43 }
44 bool flag = false ;
45 int x = i+1;
46 while(true)
47 {
48 for(j = x; j <= i+x-1&& j<=n; j++)
49 {
50 if(!cnt[ans[j]])
51 {
52 flag = true;
53 break;
54 }
55 cnt2[ans[j]]++;
56 }
57 x = j;
58 for(j = 0; j < v; j++)
59 {
60 if(cnt[tx[j]]!=cnt2[tx[j]])
61 {
62 flag = true;
63 }
64 cnt2[tx[j]] = 0;
65 }
66 if(flag || x == n+1)
67 {
68 break;
69 }
70 }
71 for(j = 0; j < v; j++)
72 {
73 cnt[tx[j]] = 0;
74 }
75 if(!flag)ask[cn++] = i;
76 if(i!=n/i)
77 {
78 v = 0;
79 for(j = 1; j <= k; j++)
80 {
81 if(!cnt[ans[j]])
82 {
83 tx[v++] = ans[j];
84 }
85 cnt[ans[j]]++;
86 }
87 bool flag = false ;
88 int x = k+1;
89 while(true)
90 {
91 for(j = x; j <= k+x-1&& j<=n; j++)
92 {
93 if(!cnt[ans[j]])
94 {
95 flag = true;
96 break;
97 }
98 cnt2[ans[j]]++;
99 }
100 x = j;
101 for(j = 0; j < v; j++)
102 {
103 if(cnt[tx[j]]!=cnt2[tx[j]])
104 {
105 flag = true;
106 }
107 cnt2[tx[j]] = 0;
108 }
109 if(flag || x == n+1)
110 {
111 break;
112 }
113 }
114 for(j = 0; j < v; j++)
115 {
116 cnt[tx[j]] = 0;
117 }
118 if(!flag)ask[cn++] = k;
119 }
120 }
121 }
122 ask[cn++] = n;
123 sort(ask,ask+cn);
124 printf("%d",ask[0]);
125 for(i = 1; i < cn; i++)
126 {
127 printf(" %d",ask[i]);
128 }
129 printf("\n");
130 }
131 return 0;
132 }
												

Abelian Period的更多相关文章

  1. HDU 5908 Abelian Period(暴力+想法题)

    传送门 Description Let S be a number string, and occ(S,x) means the times that number x occurs in S. i. ...

  2. HDU 5908 Abelian Period (BestCoder Round #88 模拟+暴力)

    HDU 5908 Abelian Period (BestCoder Round #88 模拟+暴力) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=59 ...

  3. HDU 5908 Abelian Period 暴力

    Abelian Period 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5908 Description Let S be a number st ...

  4. HDU5908 Abelian Period 暴力

    题目大意:将一个数组分成长度为k的几个连续区间,如果每个区间内各个元素出现的次数相同,则称k为一个阿贝尔周期,从小到大打印所有阿贝尔周期,数据间加空格. 题目思路:map+暴力 #include< ...

  5. HDU 5908 Abelian Period 可以直接用multiset

    http://acm.hdu.edu.cn/showproblem.php?pid=5908 要求把数组分成k组使得每组中的元素出现次数相同 就是分成k个集合,那么直接用multiset判定就可以 有 ...

  6. 【29.27%】【hdu 5908】Abelian Period

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Others) 问题描述 设SS是一个数字串,定义 ...

  7. BestCoder #88(1001 1002)

    Find Q Accepts: 392 Submissions: 780 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/131 ...

  8. TCP Provider The semaphore timeout period has expired

    我们一数据库服务器上有个作业最近几天偶尔会遇到下面错误(敏感信息已做处理),主要是报"TCP Provider: The semaphore timeout period has expir ...

  9. SSRS 2008 R2 错误:Timeout expired. The timeout period

    今天遇到了Reporting Services(SQL SERVER 2008 R2)的报表执行异常情况,报表加载数据很长时间都没有响应,最后报"An error occurred with ...

随机推荐

  1. Java实现单链表的增删查改及逆置打印

    //所提供的接口 LinkList.java package Struct; public interface LinkList {//判断链表为空public boolean linkListIsE ...

  2. ORACLE 本session产生的redo

    select * from v$statname a ,v$mystat bwhere a.STATISTIC# = b.STATISTIC# and a.name = 'redo size';

  3. java设计模式—Decorator装饰者模式

    一.装饰者模式 1.定义及作用 该模式以对客户端透明的方式扩展对象的功能. 2.涉及角色      抽象构件角色:定义一个抽象接口,来规范准备附加功能的类. 具体构件角色:将要被附加功能的类,实现抽象 ...

  4. 3.0 go mod之远程仓库搭建-代码示例

    注意事项 所谓的远程仓库指的是github,个人首次使用go mod在其他云仓库上尝试,并未成功,这浪费了我近2小时的时间: 如果你是初次尝试,那么除了github的地址换一下之外,其他的都按照示例操 ...

  5. Grafana 任意文件读取漏洞 (CVE-2021-43798)学习

    漏洞概述 Grafana是一个跨平台.开源的数据可视化网络应用程序平台.用户配置连接的数据源之后,Grafana可以在网络浏览器里显示数据图表和警告. Grafana 的读取文件接口存在未授权,且未对 ...

  6. 带你了解 Angular 与 Angular JS

    Angular 是一个基于 TypeScript 的开源客户端框架,专为构建 Web 应用程序而设计. 另一方面,AngularJS 是 Angular 的第一个版本,用纯 JavaScript 编写 ...

  7. 使用 WPF 做个 PowerPoint 系列 基于 OpenXML 解析实现 PPT 文本描边效果

    本文是使用 WPF 做个 PowerPoint 系列的博客,本文来告诉大家如何解析 PPT 里面的文本描边效果,在 WPF 应用中绘制出来,实现像素级相同 背景知识 在开始之前,期望你了解了 PPT ...

  8. ciscn_2019_en_3

    例行检查我就不放了,64位的程序放入ida中 可以看到s到buf的距离是0x10,因为puts是遇到\x00截止.而且题目没有限制我们s输入的数量,所以可以通过这个puts泄露出libc的基值 很明显 ...

  9. NepCTF pwn writeup

    上周抽时间打了nepnep举办的CTF比赛,pwn题目出的挺不错的,适合我这种只会一点点选手做,都可以学到新东西. [签到] 送你一朵小红花 64位程序,保护全开. 程序会在buf[2]处留下一个da ...

  10. 【 二进制】Windows API 记录

    FindWindow 原型: HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName ); 该函数获得一个顶层窗口的句柄,该窗口的类名和窗 ...