标签:ros 字母 复杂 不同 数据 class cst span --
【POJ1509】Glass Beads
【题目描述】给定字符串S,并规定首尾相连成环,求出最小字典序。
【输入】输入有多个数据,第一行只包括正整数N,表示有N组数据。每个数据包括一行,输入该字符串。
【输出】对于每个数据,输出一行数据表示从哪一个字母开始为最小字典序排列。
【题解思路】暴力是个好东西,咳咳咳
该题为赤果果的最小表示。
Q:最小表示是什么?
A:看题目描述撒。
Q:怎么个表示法呢?
A:莫急,往下看哈。
(1) 从i = 1,j = 2开始往后扫描,若扫描了n个字符串之后仍然相等,说明S只由1种字符构成,那么输出数字1即可;
(2) 若在i+k与j+k处发现不等,若A[i+k]>A[j+k],令i = i+k+1。若此时i = j,再令i = i+1。若A[i+k]<A[j+k],令j = j+k+1。若此时i = j,再令j = j+1;
(3) 扫描完之后,若i>n,A[j]为最小表示,若j>n,A[i]为最小表示。
该算法时间复杂度为O(n)。
1 #include<iostream> 2 #include<string.h> 3 #include<cstdio> 4 const int maxs = 1e4+5; 5 using namespace std; 6 int n,ans; 7 char s[maxs*2]; 8 int main(){ 9 scanf("%d",&n); 10 while(n--){ 11 scanf("%s",s+1); 12 int lens = strlen(s+1); 13 for(int i = 1;i <= lens; ++i) s[lens+i] = s[i]; 14 int i = 1,j = 2,k; 15 while(i <= lens && j <= lens){ 16 for(k = 0;k <= lens && s[i+k]==s[j+k]; k++); 17 if(k >= lens) break; 18 if(s[i+k] > s[j+k]){ 19 i = i+k+1; 20 if(i == j) i++; 21 } else{ 22 j = j+k+1; 23 if(i == j) j++; 24 } 25 } 26 ans = min(i,j); 27 printf("%d\n",ans); 28 } 29 return 0; 30 }
标签:ros 字母 复杂 不同 数据 class cst span --
原文地址:https://www.cnblogs.com/ve-2021/p/9744867.html