HDU - 2609 - How many

题目链接:HDU - 3374

题目大意:

给出n个串,每个串可以进行变形,如0110 -> 1100 -> 1001 -> 0011->0110.

变形前后是等效的,问这种情况下有多少种不同的串。

题目分析:

利用最小表示法将字符变为最小表示,存入set里面,最后的set里面的个数

就是不同的字符串。

最小表示法的讲解:

http://www.cnblogs.com/XGHeaven/p/4009210.html

听说和后缀自动机有关(逃

给出代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <string>
 5 #include <vector>
 6 #include <string>
 7 #include <set>
 8 #include <cstring>
 9 using namespace std;
10 int get_s(string s)
11 {
12     int i=0;
13     int j=1;
14     int k=0;
15     int n=s.length();
16     while(i<n&&j<n&&k<n)
17     {
18         int t=s[(i+k)%n]-s[(j+k)%n];
19         if(!t)
20             k++;
21         else
22         {
23             if(t>0)
24                 i+=k+1;
25             else
26                 j+=k+1;
27             if(i==j)
28                 j++;
29             k=0;
30         }
31     }
32     return i<j?i:j;
33 }
34 set<string> s;
35 int main()
36 {
37    int t;
38    while(cin>>t)
39    {
40        s.clear();
41        for(int i=0;i<t;i++)
42        {
43            string a;
44            cin>>a;
45            int h=get_s(a);
46            string ss="";
47            int cnt=0;
48            int n=a.length();
49            for(int j=h;cnt<n;j++)
50            {
51                cnt++;
52                ss+=a[j%n];
53            }
54            s.insert(ss);
55          //  cout<<ss<<endl;
56        }
57        cout<<s.size()<<endl;
58    }
59    return 0;
60 }

时间: 2024-12-30 13:54:23

HDU - 2609 - How many的相关文章

hdu 2609 How many 最小表示法

How many Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1248    Accepted Submission(s): 486 Problem Description Give you n ( n < 10000) necklaces ,the length of necklace will not large than 100

[最小表示法] hdu 2609 How many

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2609 How many Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1225    Accepted Submission(s): 476 Problem Description Give you n ( n < 10000) nec

hdu 2609 How many(最小表示法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2609 题意:给你n个字符串每个字符串可以左右移动但还是同一串比如 0110 可以表示为 0110 -> 1100 -> 1001 -> 0011->0110 这些都属于同一个字符串,最后问这n个字符串里一共有多少不同的字符串 可以将这些字符串都以其最小表示方法存下来复杂度为O(n)然后在sort一遍找一下有几个不同的就行了. #include <iostream> #inc

HDU 2609 最小表示法

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2609 题意:给定n个循环链[串],问有多少个本质不同的链[串](如果一个循环链可以通过找一个起点使得和其他串相同,那么就认为这2个链是一样的.就是求不同构的串) 思路:对于求同构串可以用最小表示法,然后判断是否相等就可以知道这2个是否是同构了.判重用的是set #define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<cstdi

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

还需要再消化一下这个算法.. 今天没有时间了,, 六级过了 就有大把时间 快活啊!#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<set> using namespace std; int getmin(string s) { int n=s.size(); int i=0,j=1,k=0,t; while(i<n &&a

HDU 2609 How many (最大最小表示法)

How many Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2184    Accepted Submission(s): 904 Problem Description Give you n ( n < 10000) necklaces ,the length of necklace will not large than 100

How many - HDU 2609 (trie+最小表示)

题目大意:有 N 个手链,每个手链的最大长度不超过100,求出来最多有多少个不同的手链.   分析:因为手链是可以转动的,所以只要两个手链通过转动达到相同,那么也被认为是一种手链,然而如果每次都循环比较的话无疑是非常浪费时间的,不过如果把每个串都用最小的字典序表示出来,那么同样的手链肯定会变成相同的状态,比如第二组数据 原串    最小表示法(字典序最小的串) 1010 --> 0101 0101 --> 0101 1000 --> 0001 0001 --> 0001 这样就比较

hdu 2609 How many (最小表示法)

题意 给 \(n\) 个循环串,求本质不同串的数量 传送门 思路 最小表示法求下标,从最小下标处作为串的起点,将新串放到map中去重,最终map中的元素数量即为最终答案. 最小/大表示法 Code #include <cstdio> #include <cstring> #include <map> #include <string> using namespace std; const int maxn = 1e6+10; int n, l; char s

KMP 总结

再次回来总结KMP,发现有点力不从心,学久了,越觉得越来越不理解了. 估计是写KMP已经不下50遍了吧.每次用都是直接默写.. KMP算法,串模式匹配算法,通过预处理得到next数组,再进行匹配. 几个要重点记忆的地方: 1. next数组的含义 next[i] = t 表示以i位置结尾的前缀串(相对于原串是前缀串)的真前缀和真后缀相等的最大值为t 2. 最小覆盖子串: 我不会证明,但是记得住结论,记len表示字符串的长度,则这个字符串的最小覆盖子串为 len - next[len] 3. KM