hdu2609(最小表示法)

题意:有n个环形字符串,一个环形字符串移动会形成不能的字符串,我们把它们看作同一串字符串,求有多少个不同的字符串.......

思路:用最小表示发将一个环形串的最小字典序找出来,然后让这个环形串按照这个顺序来组成一个新的串,其他串都这样处理,然后去重,输出结果就是了.......

#include<iostream>

#include<stdio.h>

#include<string.h>

#include<algorithm>

using namespace std;

char s[10005][105];

struct node

{

	char ch[105];

}t[10005];

int cmp(const node a,const node b)

{

	if(strcmp(a.ch,b.ch)<0)

	return 1;

	else

	return 0;

}

int work(int m,char str[]) 

{ 

    int i,j,l; 

    i=0; j=1; 

    while(i<m && j<m) 

    { 

        for(l=0;l<m;l++)  

            if(str[(i+l)%m]!=str[(j+l)%m]) break; 

        if(l>m) break; 

        if(str[(i+l)%m] > str[(j+l)%m]) 

            i=i+l+1; 

        else

            j=j+l+1; 

        if(i==j) j=i+1; 

    } 

    if(i<j) return i; 

    return j; 

} 

int main()

{

	int n;

	while(scanf("%d",&n)>0)

	{

		for(int i=1;i<=n;i++)

		scanf("%s",s[i]);

		for(int i=1;i<=n;i++)

		{

			int len=strlen(s[i]);

			int cnt=work(len,s[i]);

			strcpy(t[i].ch,s[i]+cnt);

			s[i][cnt]='\0';

			strcpy(t[i].ch+len-cnt,s[i]);

		}

		sort(t+1,t+1+n,cmp);

		int sum=1;

		for(int i=2;i<=n;i++)

		{

			if(strcmp(t[i-1].ch,t[i].ch)!=0)

			sum++;

		}

		printf("%d\n",sum);

	}

	return 0;

}

 

你可能感兴趣的:(HDU)