How many
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1313 Accepted Submission(s): 514
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.
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').
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <queue>
#include <ctime>
#include <algorithm>
#define ll long long
using namespace std;
const int INF = 1e9;
const int maxn = 10005;
struct node{
char s[1005];
}str[maxn];
int n;
int Minrp(char *s, int len){
int i = 0, j = 1, k = 0;
while(i < len && j < len && k < len)
{
int t = s[(i + k) % len] - s[(j + k) % len];
if(t == 0) k++;
else
{
if(t > 0) i = i + k + 1;
else j = j + k + 1;
if(i == j) j++;
k = 0;
}
}
return min(i, j);
}
bool cmp(node a, node b){
return strcmp(a.s, b.s) < 0;
}
int main()
{
char a[1005];
while(~scanf("%d", &n))
{
for(int i = 0; i < n; i++)
{
scanf("%s", a);
int len = strlen(a), cnt = 0;
int k = Minrp(a, len);
for(int j = k; j < len; j++) str[i].s[cnt++] = a[j];
for(int j = 0; j < k; j++) str[i].s[cnt++] = a[j];
str[i].s[cnt] = '\0';
}
sort(str, str + n, cmp);
int ans = 1;
for(int i = 1; i < n; i++)
if(strcmp(str[i].s, str[i - 1].s) != 0) ans++;
printf("%d\n", ans);
}
return 0;
}