HDU 2609 (STL+hash+最小表示法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2609

题意:给你n个等长含有 0 1 的字符串,字符串为环形,问一共有多少种串。

题解:这题的方法是最小表示法+... 就是用最小表示法处理后,可以用很多方法解决,比如字典树、二叉树等等。

楼主用的是hash+STL过的,时间46ms,跪求15ms的代码。。。。

 

代码如下:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<set>
 6 using namespace std; 
 7 const int maxn = 10000;
 8 set<int>set1;
 9 unsigned long long int s3;
10 int seed=3;
11 int smallest(char *s,int len) 
12 {
13     int i = 0,j = 1,k = 0;
14     char s2[205];
15     strcpy(s2,s);
16     strcat(s,s2);
17     while(i<len&&j<len)
18     {
19         k=0;
20         while(k<len&&(s[i+k]==s[j+k]))
21             k++;
22         if(k>=len)
23             break;
24         if(s[i+k]>s[j+k])
25             i=max(i+k+1,j+1);
26         else
27             j=max(i+1,j+k+1);
28     }
29     return min(i,j);
30 } 
31 int main()
32 {
33     int n;
34     char s1[205];
35     while(~scanf("%d",&n))
36     {
37         int len;
38         for(int i=0;i<n;i++)
39         {    
40             s3=0;
41             scanf("%s",s1);
42             if(i==0)
43             len = strlen(s1);
44             int k1=smallest(s1,len);
45             for(int j=k1;j<len;j++)
46               s3=s3*seed+(s1[j]-'0');
47             for(int j=0;j<k1;j++)
48               s3=s3*seed+s1[j]-'0';
49             set1.insert(s3);
50         }
51         cout<<set1.size()<<endl;
52         set1.clear();
53     }
54 }
View Code

 

posted on 2015-07-19 16:52  小松song  阅读(158)  评论(0)    收藏  举报

导航