#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; }