题意:给定 n 个等长的字符串,每个字符串可通过移位变换,求不同种类的字符串(两个不同种类的字符串不能通过移位得到对方)。
分析:每个种类的字符串的最小表示法(字典序最小)都是一样的,所以求出每个字符串的最小表示然后放进set就行了(set自动去重)。
代码:
#include<set>
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
set<string>s;
int GetMin(string s)
{
int len=s.length();
int i=0,j=1,k=0,t;
while(i<len && j<len && k<len)
{
t=s[(i+k)%len] - s[(j+k)%len];
if(!t) k++;//两字符相等
else
{
if(t>0) i+=k+1;//i位置数值大
else j+=k+1;
if(i==j)j++;//i,j指针指向同一位置时
k=0;
}
}
return min(i,j);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
s.clear();
string a,tmp;
while(n--)
{
cin>>a;
int bg=GetMin(a);
tmp.clear();
for(int i=0;i<a.length();i++)
{
char c=a[(i+bg)%a.length()];
tmp+=c;
}
s.insert(tmp);
}
cout<<s.size()<<endl;
}
}