基本的な文字列の扱いに慣れる問題です.
各言語の仕様をきちんと把握しておくことで,素早く解答ができるでしょう.
問題原案:@machoniump
入力の受け取りや出力については,ここでは説明されていません.
そういった内容が知りたい方は各言語のリファレンス等を見たり「標準入出力」などといったキーワードを用いて検索をかけたりするとよいでしょう.
「計算量」などの用語やプログラミング言語の基礎的な文法についてもの意味についても同様です。
「 の先頭の 文字を の末尾に移動する」という操作をプログラムで表現するにはどうするのがよいでしょうか.
色々な方法が考えられますが,そのうちの一つをご紹介します.
与えられた操作を整理してみましょう.
とすると, 回操作したあとの文字列は になります.
これからわかる通り,件の操作は「 を先頭の 文字と,それ以外の文字列に分割し,それらの順番を逆にして連結する」のように言い換えることができます.
上記の場合は と に分割すればよいです.
では,これをコードにしてみましょう.
上記のことを実装するには次の二つのことができればよいです.
は,多くの言語で S[0]
というようにして行うことができます.
は,for
文によって 文字目以降を順番に取得していくことでも実現できますが,substr()
などの関数を使用すると便利でしょう.
この関数や類似の機能はほとんどの言語に存在します.詳しい仕様については確認言語のリファレンスを参照してください.
以上のことを 回繰り返すことで,目的の文字列が得られます.
ほとんどの言語で,「文字列の一部を 文字分を取得する」という操作の時間計算量は です.
また,「複数の文字列を連結する」という操作では,大抵連結後の文字列を新たに生成することになるため,計算量はその文字列の長さに比例します.
今回の「 を先頭の 文字と,それ以外の文字列に分割し,それらの順番を逆にして連結する」という操作では,
で,以上を合わせて です.
さらにそれらを 回繰り返すので,全体では となります.
という制約より,これは 秒の実行時間制限に十分間に合います.
解説はこのページの下部にあります
(難易度順)
(難易度順)
xxxxxxxxxx
using namespace std;
int main() {
int N, K; cin >> N >> K;
string S; cin >> S;
for(int i=0; i<K; ++i) S = S.substr(1) + S[0];
cout << S << "\n";
return 0;
}
xxxxxxxxxx
N, K = map(int, input().split())
S = input()
for _ in [0] * K: S = S[1:] + S[0]
print(S)
xxxxxxxxxx
interface Main {
static void main(String[] $) {
var scanner = new java.util.Scanner(System.in);
int N = scanner.nextInt(), K = scanner.nextInt();
String S = scanner.next();
for(int i=0; i<K; ++i) S = S.substring(1) + S.charAt(0);
System.out.println(S);
}
}
xxxxxxxxxx
N,K=map(int,input().split())
S=input()
print((S+S)[K%N:K%N+N])