PKU 1026(途中)

またもやTime Limit Exceeded

#include <cstdio>

using namespace std;

int main(){
	char *src, *dst;
	int i, j, k, *key, keylen;

	scanf("%u\n", &keylen);
	key = new int[keylen];

	for(i = 0; i < keylen; i++){
		scanf("%u[ \n]", &key[i]);
		key[i]--;
	}

	src = new char[keylen + 1];
	dst = new char[keylen + 1];

	while(1){
		scanf("%u ", &k);
		if(k == 0) break;

		for(i = 0; i < keylen + 1; i++){
			src[i] = ' ';
			dst[i] = 0;
		}

		gets(src);

		for(i = 0; i < keylen; i++)
			if(!src[i]){ src[i] = ' '; break; }

		for(j = 0; j < k; j++){
			for(i = 0; i < keylen; i++){
				dst[key[i]] = src[i];
			}
			
			for(i = 0; i < keylen + 1; i++)
				src[i] = dst[i];
		}
		puts(dst);
	}
	return 0;
}

結構全面的に書きなおしたのに。ってかこれじゃほぼCじゃん。一応ボトルネックになりそうな箇所は全部なおしたつもりなんだけどなあ…

言語Cにかえてみるっていうインチキも駄目。どうすればいいんだろう…
あとはscanf使いすぎとかぐらいしか思い当たらない。あるいは毎回キーの長さ分だけスワップするんじゃ駄目とか?
それ意外のforは減らせる気がしない。