#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
string a;
int N;
map<string,int>flag;
int main()
{
int i,j,k,m,n,len,num;
string s;
while(~scanf("%d",&N))
{
num=0;
flag.clear();
for(i=1;i<=N;i++)
{
s=""; //置空串
cin>>a;
j=0; //j为记录最小串的起始位置
k=1; //方便比较所以设置的变量
len=a.size();
while(k<len) //循环结束标志
{
if(a[j]<a[k])
k++;
else if(a[j]>a[k])
{
j=k;
k=j+1;
}
else
{
int sum;
m=j;
n=k;
for(sum=1;sum<len;sum++) //循环次数
{
m%=len; //取余很重要,等于长度时再从第一个位置开始比较
n%=len;
if(a[m]<a[n])
{
k++;
break;
}
else if(a[m]>a[n])
{
j=k;
k++;
break;
}
m++;
n++;
}
if(sum==len) //千万不要忘了始终相等的这种情况也要处理
{
k++;
}
}
}
int p;
for(p=1;p<=len;p++) //从j位置开始截取子串
{
s=s+a.substr(j,1) ;
j++;
j%=len;
}
if(flag[s]!=1) //前面没有该串,则num++,并将该串标记
{
num++;
flag[s]=1;
}
}
cout<<num<<endl;
}
return 0;
}
杭电2609
最新推荐文章于 2018-09-11 17:22:40 发布