How many HDU - 2609

原题链接

KMP+标准化+最大最小表示法

错误思路:

       看到这题的第一反应是破环成链思想,枚举它能循环得到的字符串...算了下时间复杂度大概率TLE,看了别人的提示才反应过来是标准化...

正确思路:

       像这种一种表示多种形态的字符串大概率用标准化了,我们用最小最大表示法求最大或最小值,用set或map去重得到答案

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 10010;
 4 char s[N][110],ans[110];
 5 int GetMin(char* a)
 6 {
 7     int len = strlen(a+1);
 8     int i = 1,j = 2, k = 0;
 9     while(i<=len&&j<=len&&k<=len){
10         int t = a[i+k>len?(i+k)%len:i+k]-a[j+k>len?(j+k)%len:j+k];
11         if(!t) k++;
12         else{
13             if(t>0) i = i+k+1;
14             else if(t<0) j = j+k+1;
15             if(i==j) j++;
16             k = 0;
17         }
18     }
19     return (i<j?i:j);
20 }
21 int main()
22 {
23     int n;
24     set<string> st;
25     while(scanf("%d",&n)!=EOF)
26     {//统计不同形态的字符串个数 :考察知识点:标准化 
27         st.clear();
28         for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
29         for(int i=1;i<=n;i++){
30             int tar = GetMin(s[i]);
31             int len = strlen(s[i]+1);     
32             for(int t = 1,j= tar;t<=len;t++) { 
33                 ans[t] = s[i][j];
34                 j = j%len+1;
35             }
36             ans[len+1] = '\0';
37             string tmp = ans+1;
38             st.insert(tmp);
39         }
40         printf("%d\n",st.size());
41     } 
42     return 0;
43 } 

 

posted @ 2021-01-01 10:17  acmloser  阅读(102)  评论(0编辑  收藏  举报