您的位置:首页 > 其它

How many---hdu2609(最小表示)

2015-09-29 14:26 453 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2609

给你n个01串,然后求这n个串中有几个不同的;

例如:1100 ,1001 ,0011 ,0110,这4个串都是相同的,因为他们可以通过移动得到;

我们可以通过最大最小表示法来求出串的最小字典序所对应的串,那么上面的四个串对应的都是0011,这样一来就可以很轻松的求出结果了;

后面的我们可以用把每次求得串插入到Trie树中,如果树中已经存在此串,那么就返回0,不存在就返回1;

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
using namespace std;

const int N = 110;
char s
, s0
, ss[N*N]
;

int Min_Index(char a[], int n)
{
int i=0, j=1, k=0;
while(i<n && j<n && k<n)
{
int t = a[(i+k)%n] - a[(j+k)%n];
if(t == 0)
k++;
else
{
if(t < 0)
j = j + k + 1;
else
i = i + k + 1;
if(i == j)
j++;
k=0;
}
}
return min(i, j);
}
int cmp(const void *p1, const void *p2)
{
return strcmp((char *)p1, (char *)p2);
}
int main()
{
int n, ans, len, Min, k;
while(scanf("%d", &n)!=EOF)
{
if(n==0)
{
printf("0\n");
continue;
}
k = 0;
for(int i=1; i<=n; i++)
{
scanf("%s", s0);
len = strlen(s0);

strcpy(s, s0);
strcat(s, s0);

Min = Min_Index(s, len);
memset(s0, 0, sizeof(s0));
strncpy(s0, s+Min, len);
s0[len] = '\0';
strcpy(ss[k], s0);
k++;
}
qsort(ss, k, sizeof(ss[0]), cmp);
ans = 1;
for(int i=1; i<k; i++)
{
if(strcmp(ss[i], ss[i-1])!=0)
ans++;
}
printf("%d\n", ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: