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 }
浙公网安备 33010602011771号