2609 how many (hdu)

2609 how many (hdu)
 1 #include < stdio.h >
 2 #include < string .h >
 3 #include < stdlib.h >
 4 char  a[ 10000 ][ 1000 ];
 5 int  cmp( const   void   * a, const   void   * b)
 6 {
 7        return strcmp((char *)a,(char *)b);
 8}

 9 int  zh( char   * s,  int  l) // 最小表示法 从return值开始为最小 
10 {
11    int i = 0, j = 1, k = 0, t;
12    while (i < l && j < l && k < l)
13    {
14        t = s[(i + k)%l] - s[(j + k)%l];
15        if (!t) ++ k;
16        else
17        {
18            if (t > 0)
19            {
20                 i = i + k + 1;
21            }

22            else 
23            {
24                j = j + k + 1;
25            }

26            if (i == j) ++j;
27            k = 0;
28        }

29    }

30    return i>j?j:i;
31}

32 int  main()
33 {
34    int n,si,q,l;
35    int i,j,p,c,k;
36    char b[1000],cc[1000];
37    while(scanf("%d",&n)!=EOF)
38    {
39        c=0;
40        memset(a,0,sizeof(a));
41        getchar();
42        for(i=0;i<n;i++)
43        {
44            scanf("%s",b);
45            l=strlen(b);
46            si=zh(b,l);
47            for(j=si,k=0;j<l;j++,k++)
48            {
49                a[i][k]=b[j];
50            }

51            for(j=0;j<si;j++,k++)
52            {
53                a[i][k]=b[j];
54            }

55            a[i][k]='\0';
56        }

57        qsort(a,n,sizeof(a[i]),cmp);
58        c=1;
59        for(i=1;i<n;i++)
60        {
61            if(strcmp(a[i-1],a[i])!=0)
62                c++;
63        }

64        printf("%d\n",c);
65    }

66}

67     
68

你可能感兴趣的:(2609 how many (hdu))