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;
View Code
给你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
相关文章推荐
- 用sed替换文件中的空格
- mysql5.5多实例安装
- Nginx-Squit
- 移动web如何显示出滚动条
- Java 中非公平锁与公平锁的区别
- 如果没有 Android,世界会怎样?-IT蓝豹
- Lucene--DirectoryReader
- CocoaPods 的又一个小坑 required by `Podfile`
- Tools ------ Download ------Installing the SDK
- 查找rust平台相关代码的文档
- 顺序表实现两个集合的合并
- 数据库的增长方式
- 版本检测更新 调用AppStore 显示自己的app
- 微软笔试题-highways
- R中的列表与数据框
- 斯坦福iOS7 2013-2014秋Assignment 6的一种答案 #3
- permutation 问题小结——康托展开
- UIViewController的基本概念与生命周期
- 如何正确配置Nginx+PHP
- iOS中需要注意的小细节