1. 程式人生 > 實用技巧 >UVA-1584 Circular Sequence(環形字典序比較)

UVA-1584 Circular Sequence(環形字典序比較)

看到環形,首先想到乘兩倍拆成線性;

對於這種固定長度的子串比較,對每一個子串,可以考慮通過第一個字元的位置進行標記。

還有UVA竟然禁止用gets,所以此題只能用fgets,記住fgets會把行末回車讀進來,所以算長度的時候應該-1;

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 const int MAX=205;
 4 int t,ls,ans;
 5 char s[MAX];
 6 bool check(int x,int y){
 7     int i,j;
 8     for (i=0;i<ls;i++){
 9
if (s[x+i]!=s[y+i]) 10 return s[x+i]<s[y+i]; 11 } 12 } 13 int main(){ 14 freopen ("circular.in","r",stdin); 15 freopen ("circular.out","w",stdout); 16 int i,j; 17 scanf("%d\n",&t); 18 while (t--){ 19 fgets(s+1,105,stdin); 20 ls=strlen(s+1
)-1;ans=1; 21 for (i=1;i<=ls;i++) 22 s[i+ls]=s[i]; 23 for (i=2;i<=ls;i++) 24 if (check(i,ans)) 25 ans=i; 26 for (i=0;i<ls;i++) 27 putchar(s[i+ans]); 28 putchar('\n'); 29 } 30 return 0; 31 }