如果是环状可以复制一份变直线
求字符串最小表示法,如果存在一种,两个字符串相比前面相同,但是到后面不相同,且必然其中一个字典序打一些,那么大的字符串必然不可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