标签: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 }
标签:ble its tar c++ 标准化 字符 rgba 统计 ons
原文地址:https://www.cnblogs.com/newblg/p/14219494.html