HDU5908 Abelian Period 暴力
Posted 声声醉如兰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU5908 Abelian Period 暴力相关的知识,希望对你有一定的参考价值。
题目大意:将一个数组分成长度为k的几个连续区间,如果每个区间内各个元素出现的次数相同,则称k为一个阿贝尔周期,从小到大打印所有阿贝尔周期,数据间加空格。
题目思路:map+暴力
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<vector> 5 #include<stdio.h> 6 #include<stdlib.h> 7 #include<queue> 8 #include<math.h> 9 #include<map> 10 #define INF 0x3f3f3f3f 11 #define MAX 100005 12 #define Temp 1000000000 13 14 using namespace std; 15 16 int a[MAX],vis[MAX]; 17 18 int check(int k,int n) 19 { 20 map<int ,int> map1,map2; 21 for(int i=1; i<=k; i++) 22 map1[a[i]]++; 23 for(int i=k+1; i<=n-k+1; i+=k) 24 { 25 map2.clear(); 26 for(int j=0; j<k; j++) 27 { 28 int num=a[i+j]; 29 map2[num]++; 30 } 31 if(map1!=map2) 32 return 0; 33 } 34 return 1; 35 } 36 37 int main() 38 { 39 int T,n,ans; 40 scanf("%d",&T); 41 while(T--) 42 { 43 memset(vis,0,sizeof(vis)); 44 scanf("%d",&n); 45 for(int i=1; i<=n; i++) 46 { 47 scanf("%d",&a[i]); 48 } 49 50 for(int i=1; i<=n/2; i++) 51 { 52 if(!vis[i] && n%i==0)//如果2成立,那么如果2的倍数m能被n整除,则m也成立 53 { 54 if(check(i,n)) 55 { 56 for(int j=i; j<=n/2; j+=i) 57 { 58 if(j!=n && n%j==0) 59 { 60 vis[j]=1; 61 } 62 } 63 } 64 } 65 } 66 for(int i=1; i<n; i++) 67 { 68 if(vis[i]) 69 printf("%d ",i); 70 } 71 printf("%d\\n",n); 72 } 73 return 0; 74 }
以上是关于HDU5908 Abelian Period 暴力的主要内容,如果未能解决你的问题,请参考以下文章