C.Cutと貼り付け

問題の意味:私たちは、文字列sスタートからなる1、2、3を作った長さSと呼ぶ| Sは|、i番目の文字SIと呼ばれる
カーソル、位置L {0にカーソルがあります.. 。、| | S}の範囲
であればL = 0、最初の文字の前にカーソルの位置
、Lもし= | | S、最後の文字の後にカーソルの位置
、もし0 <L <| S |、カーソルSL SLと+ 1の間の文字位置

私たちは、文字列cを持っている、と呼ばれるまな板、スタートは空です

:3つの動作モードがある
。1.移動動作は:一度インクリメント右、Lにカーソルを1つのステップ移動させ
2切断動作を:文字SRIGHT Cする権利は、そう文字の左側ことSLEFTがSに
操作を貼り付け3:文字列を付加します文字列sにC。

Lは、開始位置0であり、我々は、次の操作を持っている:
1.移動操作
2.クリッピング操作実行
S1が見ペースト(SLは、位置座標のカーソルの数を示す)が行わ3を
、L == X場合4.停止は、そうでない場合はステップ1に戻ります

入力:
所与のTテスト・データ・セットは、テストデータの各セットは、x(1 <= X <= 10 ^ 6)、 二行目は、文字列sであります

出力:
テストの各セットについて、これらのステップが完了した後、金型10の長さ、S ^ + 9 7、出力応答

分析:レッツ・コール\(S T ^は\) と呼ばれる丸いトンの文字列の後に文字列sをです\(S ^ 0 \)であると呼ばれる最初の文字列s、(S_I \ドット\)\文字列に後ろiは文字sは、
我々は得ることができ(\ S ^ T)\を\(S ^ {T-1 } \) 得られた式:
\ [S ^ T = S ^ {T-1} + S ^ {T-1} _ {
T + 1} \ドット\回(S ^ {T-1} _ {T} - 1)\] 接続文字列の意味を表し+、元の文字列が、式プラスデジタル現在のカーソルの位置を引くの数-1カーソルの右側にあるすべての文字を乗じは
、次の式を得ることができる
S ^ T | | = [\ | S ^ {T-1} | + | S ^ {T-1 } _ {T + 1} \
ドット| \回(S ^ {T-1} _t - 1)\] 以来\(| S_ {I + 1} \ DOTS | = | S | - I \)
よう:式は、以下の式に置き換えることができる
\タイムズ(S ^ {T-1} _tである- S ^ T | | = | S ^ {T-1} | | +(T S ^ {T-1})\ [ --1)\]
成長は、最初のx文字で停止します

コードは以下の通りであります:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;

using LL = long long;
const LL mod = 1e9 + 7;

const int N = 1111;

char _s[N];
LL solve() {
    int x;
    scanf("%d%s", &x, _s);
    LL ls = strlen(_s);
    vector<char> s(_s, _s + ls);
    for (int i = 1; i <= x; i++) {
        int v = s[i - 1] - '1';
        if (s.size() < x) {
            vector<char> sub(s.begin() + i, s.end());
            for (int it = 0; it < v; it++) s.insert(s.end(), sub.begin(), sub.end());
        }
        ls = (ls + (ls - i) * v) % mod;
    }
    return ls;
}

int main()
{
    int t;
    scanf("%d", &t);

    while (t--)
    {
        printf("%lld\n", (solve() % mod + mod) % mod);
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/pixel-Teee/p/12109799.html