编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间
#22792 #1006. F. “全天候”壮大,CSF效应 Memory Limit Exceeded 77 2388 ms 568952 K C++ 11 / 3.9 K docriz🦆 2020-02-14 20:10:17
显示原始代码
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 200005;
const int MAXM = 23;
const int MOD = 998244353;

int n, m, k;
char s[MAXN], t[MAXN];

int tot[MAXM][MAXM];
int mat[30][MAXM][MAXM];
int pre[MAXN][MAXM][MAXM];
int suf[MAXN][MAXM][MAXM];
int tmp[MAXM][MAXM];

int getBlock(int p) { return p / k; }

int main() {
    scanf("%d", &k);
    scanf("%s", s);
    n = strlen(s);
    scanf("%s", t);
    m = strlen(t);
    if (k) {
        while (n % k != 0) {
            s[n] = 'z' + 1;
            ++n;
        }
    }
    for (int i = 0; i < 27; i++) {
        for (int j = 0; j <= m; j++) {
            mat[i][j][j] = 1;
        }
        for (int j = 0; j <= m - 1; j++) {
            if (t[j] == char(i + 'a')) {
                mat[i][j][j + 1] = 1;
            }
        }
    }
    for (int i = 0; i < n; i++) {
        if (i == 0) {
            for (int x = 0; x <= m; x++) {
                for (int y = 0; y <= m; y++) {
                    tot[x][y] = mat[int(s[i] - 'a')][x][y];
                }
            }
        } else {
            // pre[i] = pre[i] * mat[s[i] - 'a']
            memset(tmp, 0, sizeof(tmp));
            int p = s[i] - 'a';
            for (int y = 1; y <= m; y++) {
                if (mat[p][y - 1][y]) {
                    for (int x = 0; x <= m; x++) {
                        tmp[x][y] += tot[x][y - 1];
                        if (tmp[x][y] >= MOD) {
                            tmp[x][y] -= MOD;
                        }
                    }
                }
            }
            for (int x = 0; x <= m; x++) {
                for (int y = 0; y <= m; y++) {
                    (tot[x][y] += tmp[x][y]) %= MOD;
                }
            }
        }
    }
    if (k == 0) {
        printf("%d\n", tot[0][m]);
        return 0;
    }
    for (int i = 0; i < n; i++) {
        if (i % k == 0) {
            for (int x = 0; x <= m; x++) {
                for (int y = 0; y <= m; y++) {
                    pre[i][x][y] = mat[int(s[i] - 'a')][x][y];
                }
            }
        } else {
            for (int x = 0; x <= m; x++) {
                for (int y = 0; y <= m; y++) {
                    pre[i][x][y] = pre[i - 1][x][y];
                }
            }
            memset(tmp, 0, sizeof(tmp));
            int p = s[i] - 'a';
            for (int y = 1; y <= m; y++) {
                if (mat[p][y - 1][y]) {
                    for (int x = 0; x <= m; x++) {
                        tmp[x][y] += pre[i][x][y - 1];
                        if (tmp[x][y] >= MOD) {
                            tmp[x][y] -= MOD;
                        }
                    }
                }
            }
            for (int x = 0; x <= m; x++) {
                for (int y = 0; y <= m; y++) {
                    (pre[i][x][y] += tmp[x][y]) %= MOD;
                }
            }
        }
    }
    assert(n % k == 0);
    for (int i = n - 1; i >= 0; i--) {
        if ((i + 1) % k == 0) {
            for (int x = 0; x <= m; x++) {
                for (int y = 0; y <= m; y++) {
                    suf[i][x][y] = mat[int(s[i] - 'a')][x][y];
                }
            }
        } else {
            for (int x = 0; x <= m; x++) {
                for (int y = 0; y <= m; y++) {
                    suf[i][x][y] = suf[i + 1][x][y];
                }
            }
            int p = s[i] - 'a';
            memset(tmp, 0, sizeof(tmp));
            for (int x = 0; x <= m - 1; x++) {
                if (mat[p][x][x + 1]) {
                    for (int y = 0; y <= m; y++) {
                        tmp[x][y] += suf[i][x + 1][y];
                        if (tmp[x][y] >= MOD) {
                            tmp[x][y] -= MOD;
                        }
                    }
                }
            }
            for (int x = 0; x <= m; x++) {
                for (int y = 0; y <= m; y++) {
                    (suf[i][x][y] += tmp[x][y]) %= MOD;
                }
            }
        }
    }
    int res = 0;
    for (int i = 1; i < n; i++) {
        if (s[i - 1] != t[0])
            continue;
        // [i, i + k - 1]
        if (i % k == 0) {
            res += suf[i][1][m];
            if (res >= MOD)
                res -= MOD;
        } else {
            // suf[i] * pre[i + k - 1]
            int sum = 0;
            if (i + k - 1 >= n) {
                for (int t = 0; t <= m; t++) {
                    sum = (sum + suf[i][1][t] * (t == m ? 1 : 0)) % MOD;
                }
            } else {
                for (int t = 0; t <= m; t++) {
                    sum = (sum + 1LL * suf[i][1][t] * pre[i + k - 1][t][m] % MOD) % MOD;
                }
            }
            res = (res + sum) % MOD;
        }
    }
    // res = ((tot[0][m] - res) % MOD + MOD) % MOD;
    printf("%d\n", res);
    return 0;
}
子任务 #1
Memory Limit Exceeded
得分:76
测试点 #1
Accepted
得分:100
用时:4 ms
内存:1800 KiB

输入文件(1.in

50
puhpqmujuhphpmuhppppuhhpphhfupppuhhmupsphpkpuhpupppuupphpupppuhphhphppopuppphphhhphuhuxmuuuhhuuu
<214 bytes omitted>

答案文件(1.ans

8415

用户输出

8415

系统信息

Exited with return code 0
测试点 #2
Accepted
得分:100
用时:4 ms
内存:2180 KiB

输入文件(2.in

25
bodudsibxoordurxboduiiercrdrrioibsibrurrouiidimdobudqrccddduduuddcirldoodrbsrgdcuucirdrdxodrsdss
<339 bytes omitted>

答案文件(2.ans

0

用户输出

0

系统信息

Exited with return code 0
测试点 #3
Accepted
得分:100
用时:3 ms
内存:2312 KiB

输入文件(3.in

155
okvrvuupapbbruuxbkltbroyvpuhhruukuuhuurormrophkhuzkudtkubhpupvruuhutvukukkluvthbtkvrruvupprhhou
<384 bytes omitted>

答案文件(3.ans

7005424

用户输出

7005424

系统信息

Exited with return code 0
测试点 #4
Accepted
得分:100
用时:4 ms
内存:2328 KiB

输入文件(4.in

67
veztwlnrptnnawmmrlatnsemmnnwwkmnmmcmlswlwltwammnajtdsblsmpmwvrvlnsvnwtvsvltjenencfvejfjeevjjvfve
<384 bytes omitted>

答案文件(4.ans

0

用户输出

0

系统信息

Exited with return code 0
测试点 #5
Accepted
得分:100
用时:3 ms
内存:2524 KiB

输入文件(5.in

168
lyqetttbetbylytdebecttbdwebepeldbdyebydyylttbdyyeylaybdbeelbebybtmybblzbtybwbyetyebudbejdbydtlb
<379 bytes omitted>

答案文件(5.ans

11261642

用户输出

11261642

系统信息

Exited with return code 0
测试点 #6
Accepted
得分:100
用时:3 ms
内存:2584 KiB

输入文件(6.in

51
ebzzvzbesbizsbsbseieeiveehzibzbesbzvssvsvibiidzezxvbibzdeseebivbzibbbbzsizibveeezesizefzsbssivsv
<408 bytes omitted>

答案文件(6.ans

5015

用户输出

5015

系统信息

Exited with return code 0
测试点 #7
Accepted
得分:100
用时:4 ms
内存:3172 KiB

输入文件(7.in

222
wygkyylvykvwonwkblwgowarlrkawkylwkatlaaolaylovclloagogyagyovkargkwlggkybcgryogaowyvkarykorwlcvv
<414 bytes omitted>

答案文件(7.ans

32985309

用户输出

32985309

系统信息

Exited with return code 0
测试点 #8
Accepted
得分:100
用时:3 ms
内存:2704 KiB

输入文件(8.in

270
datftlytuuyteflitgufyulgeiiuuegeypxgepffgeyuaiteieguuueglltyyguixienyutqiufleiyuutfguoefeetergt
<413 bytes omitted>

答案文件(8.ans

336977768

用户输出

336977768

系统信息

Exited with return code 0
测试点 #9
Accepted
得分:100
用时:4 ms
内存:2456 KiB

输入文件(9.in

33
dpypydphdypmmmydphpppddppyphdmdmmyhymhmhydphdhpmpggggdgghggggggggggfgggggsogggggggxgcggggggggggg
<408 bytes omitted>

答案文件(9.ans

611

用户输出

611

系统信息

Exited with return code 0
测试点 #10
Accepted
得分:100
用时:5 ms
内存:2708 KiB

输入文件(10.in

190
pcllcpckcpkscclkpckkpplckcpklkkcllcpkpckkckclklkkkklkckrckpkkklkkcllppckkpkkkpcpvckllckpllnclkl
<407 bytes omitted>

答案文件(10.ans

1029783

用户输出

1029783

系统信息

Exited with return code 0
测试点 #11
Memory Limit Exceeded
得分:0
用时:963 ms
内存:535700 KiB

输入文件(11.in

64622
tiqwhhqzydyyjyttyjywychftqzjwthzuwyhypzjyctwjtwyowqyptczfrtrthzhwlchyydqtwgywchyttxqqyzwyqtey
<78969 bytes omitted>

答案文件(11.ans

9413973

用户输出

9413973
测试点 #12
Memory Limit Exceeded
得分:0
用时:346 ms
内存:568952 KiB

输入文件(12.in

68641
rkcsktcmmcurdrsgsssmgxrkktchjdexjmgslhfxxttdxghsrmzhmcmuxxctxjkdrhgxkjgmdtxkjhcndtmujxtxxrtct
<93301 bytes omitted>

答案文件(12.ans

717014923

用户输出

717014923
测试点 #13
Time Limit Exceeded
得分:0
用时:1042 ms
内存:501400 KiB

输入文件(13.in

64020
zkdzgdkdkvokdydzvodykdwdeooifwzkodzzagfyzzoiokvkopxvkoyddpzovoxyzltzoooyvzozkzddpokozydlkdvvd
<93304 bytes omitted>

答案文件(13.ans

23829095