hdu 2609 How many(字符串的最小表示法)

How many

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1313    Accepted Submission(s): 514


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
 
題意:給出n個字符串,若一個字符串左移或右移得到另一個字符串,則認爲這兩個字符串是一樣的,問有多少個不一樣的字符串。
思路:字符串的最小表示法,將所有字符串化成最小表示的形式,排序,計數。
 
AC代碼:
#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章