HDU - 2609 - How many

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
View Code

 

以上是关于HDU - 2609 - How many的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2609 How Many

hdu 2609 How many(最小表示法)

hdu 2609 How many (最小表示法)

hdu-2609 How many---最小表示法模板+set判重

随手练——HUD 2609 How many

HDU-1213-How Many Tables