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

 

posted @ 2013-08-08 11:06  紫忆  阅读(1039)  评论(0编辑  收藏  举报