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 ...
随机推荐
- 基于HTML5 Canvas可撕裂布料效果
分享一款布料效果的 HTML5 Canvas 应用演示,效果逼真.你会看到,借助 Canvas 的强大绘图和动画功能,只需很少的代码就能实现让您屏息凝神的效果. 在线预览 源码下载 实现的代码. ...
- ADO.NET数据库应用开发_ExtendedProperties属性
7.5.5 ExtendedProperties属性 ExtendedProperties属性用来获取存储自定义属性的集合.可以在该属性中增加附加的存储信息.它的扩展属性必须是字符串类型.当以XML的 ...
- 搭建自己的GitHub Pages
本文记录博主使用Win 10操作系统和Jekyll 3.1.2搭建GitHub Pages的过程.希望能帮助到相同有需要的朋友. 基本需求 GitHub账号及一个命名为{GitHub昵称}.githu ...
- ansible IP
问题解决了,用IP: "{{ ansible_eth0'ipv4' }}" 而不是{{ansible_all_ipv4_addresses}} 修改了之后的playbook 如下: ...
- 绑定QQ登录 PHP OAuth详解(转)
越来越多的网站开始采用 第三方账号登录 如qq 微博 开心网 等诸多流行的社交平台,利用第三方账号登录,可以更好地省去用户的注册时间,并且极大地提高用户体验,吸引更多的潜在用户. 让用户拥有 一个号码 ...
- 【BZOJ】1024: [SCOI2009]生日快乐(dfs)
http://www.lydsy.com/JudgeOnline/problem.php?id=1024 果然现在弱到连搜索都不会了么..... 一直想二分...但是无论如何也推不出怎么划分... Q ...
- Worktile中百万级实时消息推送服务的实现
Worktile中百万级实时消息推送服务的实现 出自:http://blog.jobbole.com/81125/
- epplus excel数据导出(数据量有点大的情况) Web和Client
Asp.net MVC后台代码 public ActionResult Export() { OfficeOpenXml.ExcelPackage ep = new OfficeOpenXml.Exc ...
- PHP字符串截取操作大全
1. 截取GB2312中文字符串 <?php header("content-type:text/html;charset=gb2312"); // echo "a ...
- 编程之美 set 10 队列中取最大值操作问题
题目 假设有这样一个拥有三个操作的队列 1. Enqueue(v) 2. Dequeue() 3. MaxEle() 请设计一种数据结构和算法, 让 MAXELE 操作的时间复杂度尽可能的低 思路 1 ...