1. 程式人生 > 實用技巧 >UVA1584環狀序列 Circular Sequence

UVA1584環狀序列 Circular Sequence

如果是環狀可以複製一份變直線

求字串最小表示法,如果存在一種,兩個字串相比前面相同,但是到後面不相同,且必然其中一個字典序打一些,那麼大的字串必然不可1-k前的子竄就不能滿足條件。

  1 #include <iostream>
  2 #include <cstring>
  3 using namespace std;
  4 
  5 char s[200];
  6 int main() {
  7 	int t;
  8 	cin >> t;
  9 	while(t --) {
 10 
 11 	cin >> s + 1;
 12 
 13 	int
n = strlen(s + 1); 14 for(int i = 1; i <= n; ++ i) s[n + i] = s[i]; 15 int i = 1, j = 2, k; 16 while(i <= n && j <= n){ 17 for (k = 0; k <= n && s[i+k] == s[j+k]; ++ k); 18 if(k == n) break; 19 if(s[i+k] > s[j+k]) 20 { 21 i = i + k + 1; 22 if(i == j) ++ i; 23
} 24 else { 25 j = j + k + 1; 26 if(i == j) ++ j; 27 } 28 } 29 int ans = min(i, j); 30 for(i = ans; i < n+ans; ++ i) 31 cout << s[i]; 32 cout << endl; 33 } 34 return 0; 35 } 環狀序列 Circular Sequence