hdu2609---How many

Problem Description

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.

Input

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’).

Output

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

Sample Input

4 0110 1100 1001 0011 4 1010 0101 1000 0001

Sample Output

1 2

Author

yifenfei

Source

奋斗的年代

Recommend

yifenfei | We have carefully selected several similar problems for you: 2608 1131 2572 1130 2610

把每一个串用最小表示法表示,然后统计出不同的字符串的个数

/*************************************************************************
    > File Name: hdu2609.cpp
    > Author: ALex
    > Mail: [email protected]
    > Created Time: 2015年02月17日 星期二 22时06分29秒
 ************************************************************************/

#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const double eps = 1e-15;
typedef long long LL;
typedef pair <int, int> PLL;

const int N = 10010;
const int M = 110;
char str[N][M];
char s[M];
set <string> st;

void minway (char str[])
{
    int len = strlen (str);
    int i = 0;
    int j = 1;
    int k = 0;
    while (i < len && j < len && k < len)
    {
        int t = str[(i + k) % len] - str[(j + k) % len];
        if (!t)
        {
            ++k;
        }
        else
        {
            if (t > 0)
            {
                i += k + 1;
            }
            else
            {
                j += k + 1;
            }
            k = 0;
            if (i == j)
            {
                ++j;
            }
        }
    }
    int start = min (i, j);
    for (int i = 0; i < len; ++i)
    {
        s[i] = str[(i + start) % len];
    }
    s[len] = ‘\0‘;
    st.insert(s);
}

int main ()
{
    int n;
    while (~scanf("%d", &n))
    {
        st.clear();
        for (int i = 1; i <= n; ++i)
        {
            scanf("%s", str[i]);
            minway(str[i]);
        }
        int size = st.size();
        printf("%d\n", size);
    }
    return 0;
}
时间: 2024-10-16 14:08:00

hdu2609---How many的相关文章

hdu2609 最小表示法

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

hdu2609最小表示法

#include <iostream> #include <algorithm> #include <string.h> #include <cstdio> #include <vector> using namespace std; const int maxn=10005; struct elem { char str[105]; int len; bool operator <(const elem &rhs)const{ r

hdu-2609 How many---最小表示法模板+set判重

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2609 题目大意: 有n个有01组成的字符串,每个字符串都代表一个项链,那么该字符串就是一个环状的结构,求可以经过循环旋转,最后不同的串有多少个.. 解题思路: 将所有字符串用最小表示法表示,然后存入set判重 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdi

KMP 知识点整理

hdu2609 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2609 思路:将每个字符串转换成最小串,然后放在set里面去重. 最小表示法: 循环字符串的最小表示法的问题可以这样描述: 对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个. 由于语言能力有限,还是用实际例子来解释比较容易: 设S=bcad,且S’是S的循环同构的串.S’可以是bcad或者cadb,adbc,dbca.而且最小表示的S’是adbc. 对于字符串循环同构的最