【题解】HDU-2609 How many

How many(HDU-2609)

题面

Give you n ( n < 10000) necklaces ,the length of necklace will not large than 100,tell me How many kinds of necklaces total have.(if two necklaces can equal by rotating ,we say the two necklaces are some). For example 0110 express a necklace, you can rotate it. 0110 -> 1100 -> 1001 -> 0011-> 0110.

输入

The input contains multiple test cases. Each test case include: first one integers n. (2<=n<=10000) Next n lines follow. Each line has a equal length character string. (string only include '0','1').

输出

For each test case output a integer , how many different necklaces.

样例输入

1
2
3
4
5
6
7
8
9
10
4
0110
1100
1001
0011
4
1010
0101
1000
0001

样例输出

1
2
1
2

提示

思路

先用最小表示法,求出最小字典序,然后map去重。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
string s;

int getmin(int n)
{
int i=0, j=1, k=0;
while(i<n && j<n && k<n)
{
if(s[(i+k)%n] == s[(j+k)%n]){
k++;
}else{
if(s[(i+k)%n] > s[(j+k)%n])
i+=k+1;
else
j+=k+1;
k = 0;
if(i == j) i++;
}
}
return min(i, j);
}

int main()
{
int n;
while(~scanf("%d", &n))
{
map<string, int> mp;
int ans = 0;
for(int i=0; i<n; i++)
{
cin >> s;
string ss = "";
int st = getmin(s.length());
for(int i=st; i<s.length(); i++) ss += s[i];
for(int i=0; i<st; i++) ss += s[i];
if(mp[ss] == 0){
mp[ss] = 1;
ans++;
}
}
printf("%d\n", ans);
}
return 0;
}