题目大意:有 N 个手链,每个手链的最大长度不超过100,求出来最多有多少个不同的手链。
 
分析:因为手链是可以转动的,所以只要两个手链通过转动达到相同,那么也被认为是一种手链,然而如果每次都循环比较的话无疑是非常浪费时间的,不过如果把每个串都用最小的字典序表示出来,那么同样的手链肯定会变成相同的状态,比如第二组数据
 
原串    最小表示法(字典序最小的串)
1010 --> 0101
0101 --> 0101
1000 --> 0001
0001 --> 0001
 
这样就比较容易判断是否相同了,可以使用字典树来判断这个串是否出现过。
 
代码如下:
==========================================================================================================
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
using namespace std; const int MAXM = ;
const int MAXN = ; struct node
{
node *next[MAXM];
}; bool BuildTrie(node *head, char s[])
{///建立字典树,如果s已经存在返回0,否则返回1
node *p = head;
bool newNode = false; for(int i=; s[i]; i++)
{
int k = s[i]-''; if(p->next[k] == NULL)
{
newNode = true;
p->next[k] = new node();
}
p = p->next[k];
} return newNode;
}
void FreeTrie(node *head)
{
node *p = head; for(int i=; i<MAXM; i++)
{
if(p->next[i] != NULL)
FreeTrie(p->next[i]);
} free(p);
}
int GetMinOrder(char s[], int N)
{///求出来最小表示的首位置
int i=, j=; while(i<N && j<N)
{
int k=; while(s[i+k] == s[j+k] && k<N)
k++; if(k == N)break; if(s[i+k] < s[j+k])
{
if(j+k > i)
j = j+k+;
else
j = i+;
}
else
{
if(i+k > j)
i = i+k+;
else
i = j+;
}
} return min(i, j);
} int main()
{
int N; while(scanf("%d", &N) != EOF)
{
char s[MAXN]={}, p[MAXN];
node *head = new node();
int ans = , len=; while(N--)
{
scanf("%s", p);
if(!len)len = strlen(p); strcpy(s, p);
strcat(s, p); int MinIndex = GetMinOrder(s, len);
strncpy(p, s+MinIndex, len);///把这个串转换成它的最小表示 ans += BuildTrie(head, p);
} printf("%d\n", ans); FreeTrie(head);
} return ;
}

How many - HDU 2609 (trie+最小表示)的更多相关文章

  1. hdu 2609 字符串最小表示法 虽然不是很懂 还是先贴上来吧。/,。/

    还需要再消化一下这个算法.. 今天没有时间了,, 六级过了 就有大把时间 快活啊!#include<iostream> #include<cstdio> #include< ...

  2. HDU 2609 最小表示法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2609 题意:给定n个循环链[串],问有多少个本质不同的链[串](如果一个循环链可以通过找一个起点使得和 ...

  3. HDU 2609 How many(最小表示+set)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2609 题目大意: 题目大意有n个有01组成的字符串,每个字符串都代表一个项链,那么该字符串就是一个环状 ...

  4. hdu 2609 How many(最小表示法)

    Problem Description Give you n ( n < 10000) necklaces ,the length of necklace will not large than ...

  5. HDU - 5457 Hold Your Hand (Trie + 最小割)

    Hold Your Hand Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)T ...

  6. hdu 2609 How many 最小表示法

    How many Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. HDU 1251 Trie树模板题

    1.HDU 1251 统计难题  Trie树模板题,或者map 2.总结:用C++过了,G++就爆内存.. 题意:查找给定前缀的单词数量. #include<iostream> #incl ...

  8. hdu String Problem(最小表示法入门题)

    hdu 3374 String Problem 最小表示法 view code#include <iostream> #include <cstdio> #include &l ...

  9. HDU(2485),最小割最大流

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2485 Destroying the bus stations Time Limit: 40 ...

随机推荐

  1. HashMap HashTable HashSet

    原文转载自 http://blog.csdn.net/wl_ldy/article/details/5941770 HashMap是新框架中用来代替HashTable的类 也就是说建议使用HashMa ...

  2. memcached和mongodb 在windows下安装

    要在新机器上安装memcached和mongodb服务,折腾了一天,终于把这两个服务在windows下跑起来了. memcached主要参考http://www.rootop.org/pages/27 ...

  3. 对UIImage进行的一些操作

    1.生成指定宽高的UIImage对象(oldImage为原始图片对象,newImage为操作后的图片对象) // 参数1:图片的尺寸 参数2:是否透明(没看出YES和NO有什么区别) 参数3:缩放(1 ...

  4. mem 族函数的实现

    1.void * memcpy ( void * dest, const void * src, size_t num ); 头文件:#include <string.h>memcpy() ...

  5. SGU 128.Snake

    时间限制:0.25s 空间限制:4m 题意: 在一个平面坐标中有N个点,现在要你用这N个点构造一个闭合图形,这个图形要满足以下条件: 1.这个图形要是闭合的:          2.图形上的点只能是给 ...

  6. js控制 点一下增加一个输入框,点一下增加一个输入框……

    <div> <div> 附件1:<input type="file" id="file1" name="file1&qu ...

  7. C#遍历窗体控件(原文出自http://www.liangshunet.com/ca/201403/286434593.htm)

    一.C#遍历窗体控件 主要遍历属于窗体(Form)的控件(Controls),假如窗体中有 Panel.Button 和 TextBox 控件,遍历代码如下: /// <summary> ...

  8. JavaIO流——File类

    1.掌握File 类的作用 2.可以使用File 类中的方法对文件进行操作 所有的 io 操作都保存在 java.io 包中. 构造方法:public File (String pathname) 直 ...

  9. C#操作xml的3种方式

    C#操作Xml有很多种方式,这里写出个人常使用的三种方式 XmlDocument DataSet linq to xml  首先声明本次操作使用的xml文件:books.xml:内容如下 <?x ...

  10. 《30天自制操作系统》读书笔记(5) GDT&IDT

    梳理项目结构 项目做到现在, 前头的好多东西都忘了, 还是通过Makefile重新理解一下整个项目是如何编译的: 现在我们拥有这么9个文件: ipl10.nas    InitialProgramLo ...