hdu2609(最小表示法+set)

How many

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


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
 

1 題目要求的是給定n個字符串,找出不同的字符串的個數。由於題目說了,字符串可以進行變換,也就是如果兩個字符串相同那麼它們的最小表示是相同的。
2 只要求出所有字符串的最小表示,然後利用set存儲,最後set的元素個數就是最後的ans

#include <iostream>
#include <set>
#include <cstring>
using namespace std;

int len,n;

int getMin(string &str, int len){
    int i=0,j=1,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=i+k+1;
            else j=j+k+1;
            if(j==i) j++;
            k=0;
        }
    }
    return min(i,j);
}

int main()
{
    const int MAXN = 210;
    string word,tep;
    set<string>s;
    while(cin>>n){
        s.clear();
        for(int i=0; i<n; i++){
            cin>>word;
            len = word.size();
            int pos = getMin(word,len);
            tep.assign(word,pos,len-pos);
            tep.append(word,0,pos);
            s.insert(tep);
        }
        cout<<s.size()<<endl;
    }
    return 0;
}


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