4
0110
1100
1001
0011
4
1010
0101
1000
0001
Sample Output
1
2
题意:给你一堆串,如果一个串通过平移可以变成另一个串,就算两个串相同。我们要求出这堆串中有多少个不同的串。
参考http://www.cnblogs.com/ziyi–caolu/p/3245348.html
最大最小表示法的模板。。。
int getmin(char *s){
int i=0,j=1,k=0;
int len=strlen(s);
while(i<len&&j<len&&k<len){
int dif=s[(i+k)%len]-s[(j+k)%len];
if(dif==0)k++;
else{
if(dif>0)i+=k+1;
else j+=k+1;
if(i==j)j++;
k=0;
}
}
return i;
}
struct Node{
char t[N];
bool friend operator<(Node a,Node b){
return strcmp(a.t,b.t)<0;
}
}a[N*100];
//2017年08月20日17:25:30 5min
char s[N];
int main(){
int n;
while(~sf("%d",&n)){
mem(a,0);
rep(i,1,n){
sf("%s",s);int len=strlen(s);
int cnt=getmin(s);
strcpy(a[i].t,s+cnt);
s[cnt]='\0';
strcpy(a[i].t+len-cnt,s);
}
sort(a+1,a+1+n);
int sum=1;
for(int i=2;i<=n;++i){
if(strcmp(a[i-1].t,a[i].t)!=0)sum++;
}
pf("%d\n",sum);
}
}