Codeforces Round # 607 (Div. 2) C. Вырезать и Вставить

Ссылка:

https://codeforces.com/contest/1281/problem/C

Значение вопросов:

outputstandard выход
Начнет с строкой с состоящим только из цифр 1, 2, или 3. Длина х обозначаются через | х |. Для каждого I от 1 до | ы |, я-ый символ х обозначается си.

Существует один курсор. расположение ℓ курсора обозначается целым числом в {0, ..., | S |}, со следующим значением:

Если ℓ = 0, то курсор расположен перед первым символом с.
Если л = | s |, то курсор находится сразу после последнего символа с.
Если 0 <л <| х |, то курсор расположен между sℓ и sℓ + 1.
Обозначим через sleft строку слева от курсора и sright строку справа от курсора.

У нас также есть строка с, которую мы называем наш буфер обмена, который начинается, как пустой. Есть три типа действий:

Переместить действие. Переместить курсор на один шаг вправо. Это приращение ℓ раз.
Cut действие. Набор с ← sright, а затем установить s ← sleft.
Вставить действие. Append значение с до конца строки s. Обратите внимание , что это не изменяет с.
Курсор изначально начинается с л = 0. Затем мы выполняем следующую процедуру:

Выполните действие Переместить один раз.
Выполните действия , один раз отрежь.
Выполните раз пасты Действия sℓ.
Если ℓ = х, остановка. В противном случае, возврат к шагу 1.
Вы дали начальную строку s и целое число х. Какова длина х , когда процедура останавливается? Так как эта величина может быть очень большой, только найти его по модулю 109 + 7.

Это гарантирует, что ℓ≤ | s | в любое время.

Идеи:

Длина х операций моделирования, оставшееся значение счетчика пройденного снова, даже не исключено. ,

Код:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MOD = 1e9+7;

int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        int x;
        string s;
        cin >> x >> s;
        int l = 1;
        while((int)s.size() < x)
        {
            int len = s.size();
            for (int i = 1;i < (int)s[l-1]-'0';i++)
                s += s.substr(l, len-l);
            l++;
        }
        LL ans = s.size()%MOD;
        for (int i = l;i <= x;i++)
        {
            int tmp = s[i-1]-'0';
            ans = (ans+(ans-i)*(tmp-1)%MOD+MOD)%MOD;
        }
        cout << ans%MOD << endl;
    }

    return 0;
}

рекомендация

отwww.cnblogs.com/YDDDD/p/12104853.html