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

How many HDU - 2609

时间:2021-01-05 10:48:42      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:ble   its   tar   c++   标准化   字符   rgba   统计   ons   

原题链接

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 } 

 

How many HDU - 2609

标签:ble   its   tar   c++   标准化   字符   rgba   统计   ons   

原文地址:https://www.cnblogs.com/newblg/p/14219494.html

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