码迷,mamicode.com
首页 > 其他好文 > 详细

HDU - 2609 - How many

时间:2017-08-29 20:36:12      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:none   ret   ++   表示   int   alt   stream   题目   opened   

题目链接: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

标签:none   ret   ++   表示   int   alt   stream   题目   opened   

原文地址:http://www.cnblogs.com/DLKKILL/p/7449959.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!