1. 程式人生 > >UVA 1584 環狀序列

UVA 1584 環狀序列

-- 開頭 給定 字典 字典序 clu cout con sca

題意:

給定一個環狀字符串,輸出字典序最小的線裝字符串。

分析:

我一開始是將原字符串*2去模擬環,然後分別截取以字符串不同字母為首的子串,然後用sort去排序輸出最小的串,復雜度為O(n^2 + nlogn)吧。

然後看了紫書的題解,用了一個函數去枚舉比較每一個字母為開頭的子串和預估答案的子串的字符串字典序大小,枚舉串的某一個字母的使整個串字符串小於另一個串(他們長度都是一樣的,只要其中一個小,那麽整個就會小,因為字典序是取決前面的字母的)就立刻更新ans,然後他用的是下標mod長度,最壞復雜度為O(n^2)。

// UVa1584(LA3225) Circular Sequence
// Rujia Liu
#include<stdio.h> #include<string.h> #define maxn 105 // 環狀串s的表示法p是否比表示法q的字典序小 int less(const char* s, int p, int q) { int n = strlen(s); for(int i = 0; i < n; i++) if(s[(p+i)%n] != s[(q+i)%n]) return s[(p+i)%n] < s[(q+i)%n];//如果小於就reture true; return 0; // 相等就不更新 } int main() {
int T; char s[maxn]; scanf("%d", &T); while(T--) { scanf("%s", s); int ans = 0; int n = strlen(s); for(int i = 1; i < n; i++) if(less(s, i, ans)) ans = i; for(int i = 0; i < n; i++) putchar(s[(i+ans)%n]); putchar(\n); } return 0; }
#include<bits/stdc++.h>
using
namespace std; int main() { int t; scanf("%d", &t); while(t--) { string a; cin>>a; int length = a.size(); a = a + a; string sub[105]; for(int i = 0; i < length; i++) { sub[i] = a.substr(i,length); //cout<<sub[i]<<endl; } sort(sub,sub+length); cout<<sub[0]<<endl; } }

UVA 1584 環狀序列