How many---hdu2609(最小表示)
题目链接: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 = 2e4+;
char s[N], s0[N]; struct node
{
node* next[];
}; int Min_Index(char a[], int n)
{
int i=, j=, k=;
while(i<n && j<n && k<n)
{
int t = a[(i+k)%n] - a[(j+k)%n];
if(t == )
k++;
else
{
if(t < )
j = j + k + ;
else
i = i + k + ;
if(i == j)
j++;
k=;
}
}
return min(i, j);
}
int Tire(char a[], node* head)
{
int flag = ;
node *p = head;
for(int i=; a[i]; i++)
{
int k = a[i]-'';
if(p->next[k]==NULL)
{
flag = ;///建立字典树,如果a已经存在返回0,否则返回1,加到结果中去;
p->next[k] = new node();
}
p = p->next[k];
}
return flag;
}
void FreeTire(node *head)///没有用到,但是还是留着当个知识点吧,释放内存;
{
node *p = head; for(int i=; i<; i++)
{
if(p->next[i] != NULL)
FreeTire(p->next[i]);
}
free(p);
} int main()
{
int n, ans, len, Min;
node*head;
while(scanf("%d", &n)!=EOF)
{
head = new node();
ans = ;
for(int i=; i<=n; i++)
{
scanf("%s", s0);
len = strlen(s0); strcpy(s, s0);
strcat(s, s0); Min = Min_Index(s, len);
memset(s0, , sizeof(s0));
strncpy(s0, s+Min, len); ans+=Tire(s0, head);
}
printf("%d\n", ans); /// FreeTire(head); }
return ;
}
不用字典树:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
using namespace std; const int N = ;
char s[N], s0[N], ss[N*N][N]; int Min_Index(char a[], int n)
{
int i=, j=, k=;
while(i<n && j<n && k<n)
{
int t = a[(i+k)%n] - a[(j+k)%n];
if(t == )
k++;
else
{
if(t < )
j = j + k + ;
else
i = i + k + ;
if(i == j)
j++;
k=;
}
}
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==)
{
printf("0\n");
continue;
}
k = ;
for(int i=; i<=n; i++)
{
scanf("%s", s0);
len = strlen(s0); strcpy(s, s0);
strcat(s, s0); Min = Min_Index(s, len);
memset(s0, , sizeof(s0));
strncpy(s0, s+Min, len);
s0[len] = '\0';
strcpy(ss[k], s0);
k++;
}
qsort(ss, k, sizeof(ss[]), cmp);
ans = ;
for(int i=; i<k; i++)
{
if(strcmp(ss[i], ss[i-])!=)
ans++;
}
printf("%d\n", ans);
}
return ;
}
How many---hdu2609(最小表示)的更多相关文章
- hdu2609 最小表示法
Give you n ( n < 10000) necklaces ,the length of necklace will not large than 100,tell me How man ...
- hdu2609最小表示法
#include <iostream> #include <algorithm> #include <string.h> #include <cstdio&g ...
- HDU2609 How many —— 最小表示法
题目链接:https://vjudge.net/problem/HDU-2609 How many Time Limit: 2000/1000 MS (Java/Others) Memory L ...
- hdu2609 How many【最小表示法】【Hash】
How many Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu2609 How many 字典树+最小表示法
Give you n ( n < 10000) necklaces ,the length of necklace will not large than 100,tell meHow many ...
- hdu2609(最小表示法)
题意:有n个环形字符串,一个环形字符串移动会形成不能的字符串,我们把它们看作同一串字符串,求有多少个不同的字符串....... 思路:用最小表示发将一个环形串的最小字典序找出来,然后让这个环形串按照这 ...
- kuangbin专题十六 KMP&&扩展KMP HDU2609 How many (最小字符串表示法)
Give you n ( n < 10000) necklaces ,the length of necklace will not large than 100,tell me How man ...
- BZOJ 1391: [Ceoi2008]order [最小割]
1391: [Ceoi2008]order Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1509 Solved: 460[Submit][Statu ...
- 《徐徐道来话Java》:PriorityQueue和最小堆
在讲解PriorityQueue之前,需要先熟悉一个有序数据结构:最小堆. 最小堆是一种经过排序的完全二叉树,其中任一非终端节点数值均不大于其左孩子和右孩子节点的值. 可以得出结论,如果一棵二叉树满足 ...
- C++ 最小化到托盘
#define WM_SHOWTASK (WM_USER + 1) void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID &a ...
随机推荐
- python将str转换成字典
典型的应用场景:Json数据的解析 >>> user "{'name' : 'jim', 'sex' : 'male', 'age': 18}" >> ...
- python保存爬取的图片
用爬虫抓取图片的保存 保存图片 request=urllib2.Request(randNumberUrl,data,headers) picture=opener.open(request).rea ...
- SpringBoot使用maven构建
1.使用maven作为parent管理 maven用户可以继承spring-boot-starter-parent项目获取合适的默认设置.该父项目提供一下特性: 默认编译级别为Java1.6 源编码格 ...
- 随机森林(Random Forest)
决策树介绍:http://www.cnblogs.com/huangshiyu13/p/6126137.html 一些boosting的算法:http://www.cnblogs.com/huangs ...
- php -- 判断文件是否存在
file_exists is_file is_dir 基本上,PHP的 file_exists = is_dir + is_file 写程序验证一下: 分别执行1000次,记录所需时间. ------ ...
- 【BZOJ】1029: [JSOI2007]建筑抢修(贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1029 按右端点排序后依次加入,并且每一次看是否能被修筑,如果能就修:否则查找原来修过的,如果原来修过 ...
- ps -ef|grep htpd|wd -l
在Linux下查看Apache的 负载情况,以前也说过,最简单有有效的方式就 是查看Apache Server Status(如何开启Apache Server Status点这里),在没有开启Apa ...
- 简易博客开发(8)----django1.9 博客部署到pythonanywhere上
准备工作 首先需要注册一下,pythonanywhere的免费账户有一定的限制,只能创建一个web app,不能绑定独立域名,不能通过ssh连接,不过只是搭一个project也是够用了. 注册成功之后 ...
- windows 系统重装之后怎么恢复oracle数据库
今天单位的服务器系统进不去了,重做了系统,有重要的oracle数据,经理让我恢复一下oracle数据,试着尝试了一下 1.首先,将原来的ORACLE文件夹改名,原来的路径是D:/oracle.我暂时改 ...
- iOS开发之--使用storyboard进行跳转
iOS开发中使用故事板进行开发是非常高效的一种方式,虽然有这样那样的问题,但是不得不承认,使用sb可以在最短的时间内完成整个项目的布局,节约开发者大量的时间,而且便于修改,非常直观,虽然可能不太灵活, ...