HDU - 2609 How many(最小表示法)
#include<iostream>
#include<set>
using namespace std;
int get_min(string s,int n)
{
int k=0,i=0,j=1;while(k<n&&i<n&&j<n){
if(s[(i+k)%n]==s[(j+k)%n]) k++;else{
if(s[(i+k)%n]>s[(j+k)%n]) i+=k+1;else j+=k+1;if(i==j) i++;k=0;}}return min(i,j);
}
int main()
{
int n;while(cin>>n){
set<string> st;while(n--){
string s;cin>>s;int l=get_min(s,s.size());string ss=s.substr(l)+s.substr(0,l);st.insert(ss);}cout<<(int)st.size()<<endl;}return 0;
}