http://acm.hdu.edu.cn/showproblem.php?pid=2609
#include<iostream>
#include<algorithm>
using namespace std;
struct Node{
char str[110];
};
Node nodes[10010];
bool com(Node &a,Node &b){
return (strcmp(a.str,b.str)<0);
}
int minexp(char *str){
int len=strlen(str);
int i=0,j=1,k=0;
while(i<len&&j<len&&k<len){
int t=str[(i+k)%len]-str[(j+k)%len];
if(t>0){
i=i+k+1,k=0;
}else if(t<0){
j=j+k+1,k=0;
}else{
k++;
}
if(i==j){
j++,k=0;
}
}
return i<j?i:j;
}
int main(){
//freopen("a.txt","r",stdin);
int number;
while(scanf("%d",&number)!=EOF){
int i;
char now[200];
for(i=1;i<=number;i++){
scanf("%s",now);
int len=strlen(now);
int where=minexp(now);
int j,t;
for(t=0,j=where;j<len;j++,t++){
nodes[i].str[t]=now[j];
}
for(j=0;j<where;j++,t++){
nodes[i].str[t]=now[j];
}
nodes[i].str[t]='\0';
}
sort(&nodes[1],&nodes[number+1],com);
int out=1;
for(i=2;i<=number;i++){
if(strcmp(nodes[i-1].str,nodes[i].str)!=0){
out++;
}
}
printf("%d\n",out);
}
return 0;
}
/*
2011-9-18
author:BearFly1990
*/
package acm.hdu.tests;
import java.io.BufferedInputStream;
import java.util.Scanner;
public class HDU_2609 {
private static StringBuilder[] sb = new StringBuilder[10001];
private static StringBuilder[] neck = new StringBuilder[100001];
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
while(in.hasNext()){
int n = in.nextInt();
for(int i = 0; i < n; i++){
sb[i] = new StringBuilder(in.next());
}
int result = check(n);
System.out.println(result);
}
}
private static int check(int n) {
neck[0]= sb[0];
int length = sb[0].length();
int ans = 1;
NEXT:for(int i = 1; i < n ; i++){
for(int j = 0; j < length; j++){
StringBuilder temp = sb[i].append(sb[i]
.charAt(0)).deleteCharAt(0);
for(int k = 0; k < ans; k++){
//System.out.println("temp:"+temp);
//System.out.println("neck:"+neck[k]);
if(temp.toString().equals(neck[k].toString())){
continue NEXT;
}
}
}
neck[ans++] = sb[i];
}
return ans;
}
}