How many
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1113 Accepted Submission(s): 442
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').
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;
}