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


如果是环状可以复制一份变直线

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