kmjp's blog

競技プログラミング参加記です

Codeforces #607 Div1 A. Cut and Paste

変な時間帯だったので不参加です。
https://codeforces.com/contest/1280/problem/A

問題

数字で構成される文字列Sが与えられる。
今、カーソルが左端にあるとする。
以下の処理をX回繰り返す。

  • カーソルを1つ右に動かす
  • カーソルの右側の文字列をクリップボードにコピーする
  • カーソル位置の数字の回数だけ末尾にペーストする。

Sの最終的な文字列長を求めよ。

解法

Sはペーストによって末尾に文字列が追加されることはあっても、既存の文字が減ったり変更したりすることはない。
そこで、Sの長さがXを超えるまでは、愚直に処理を繰り返そう。
それ以降は文字列長だけ覚えておけばよい。

int T;
int X;
int N;
string S;
ll mo=1000000007;

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>T;
	while(T--) {
		cin>>X>>S;
		ll cur=S.size();
		FOR(i,X) {
			if(S.size()<1<<20) {
				if(S[i]=='2') S+=S.substr(i+1);
				if(S[i]=='3') S+=S.substr(i+1)+S.substr(i+1);
			}
			if(S[i]=='2') (cur+=cur-(i+1))%=mo;
			if(S[i]=='3') (cur+=2*(cur-(i+1)))%=mo;
		}
		cout<<(cur%mo+mo)%mo<<endl;
	}
}

まとめ

Div1 Aにしても謎な問題。
何がしたいんだろう。