問題X:最小の文字列表現
制限時間:1秒メモリ制限:32メガバイト
提出:129溶液:36
タイトル説明
円のlenの長さの文字列を、出発点として、その後の任意の文字が、文字列表現は、辞書内のすべての文字列こと最小オーダーの最小で、文字列のlenの長さを有するであろう。
:そのようなそれの後に文字列alabala、上記の規則に従って新しい文字列に応じて形成される円として
labalaa
abalaal
balaala
alaalab
laalaba
aalabal
すべての7つの文字列が辞書式に最小aalabal、その最初のものであるという点で元の文字列内の文字の位置は6です。(ポジション0カウントから始まる)は
、今あなたがその最初の文字の位置は、元の文字列で最小を表し見つける文字列を、与えられました。複数の最小の文字列表現を、元の文字列の最小位置の最初の文字の次に出力する場合。
エントリー
入力の最初の行は整数tであり、tは試験データのセット表現しました。
L整数最初の入力(5 <= L <=の次T線 100000)は、 文字列の長さを示し、その後、元の文字列を表す文字列を入力します。文字列が小文字のみが含まれています。
輸出
元の文字列で入力と出力の最初の文字の位置毎に元の文字列の最小で表されます。
サンプル入力 のコピー
2 6 baabaa 7 alabala
サンプル出力 のコピー
1 6
コード
ヒント:
この質問は、あなたがまだ理解しているのですか?それは私にこの質問を理解するためにいくつかの時間がかかったし、最後に見つかりました:
- 文字列のサイズよりも大きくすることができるとの間(ABCEとABD:ABCE、第三の位置合わせの端ABD>)
- 2つの同一の文字列を縫合する配列のトラバースサイクルタイムを再生することができる(例:ABCDとABCD =たとえばABCDABCD)
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <math.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
string s;
cin >>s;
int len;
len=(int)s.size();
s+=s;//就循环了
string sans;
sans=s.substr(0,len);
int ans;
ans=0;
char cmin ;
cmin='z';
for(int i = 0;i < len;i++){
cmin=min(cmin,s[i]);
}
for(int i = 1;i < len;i++){
if(s[i]==cmin){
if(sans>s.substr(i,len)){
sans=s.substr(i,len);
ans=i;
}
}
}
cout<<ans<<endl;
}
return 0;
}