new file: CF2205E.cpp
This commit is contained in:
1 parent
0779388b9c
commit
a3a5747859
2 files changed
+120
No files matched your search
+36
@@ -0,0 +1,36 @@
|
|||||||
|
#include <bits/stdc++.h>
|
||||||
|
using namespace std;
|
||||||
|
const int mod = 998244353;
|
||||||
|
int t, n, a[8005], nxt[8005];
|
||||||
|
long long f[8005];
|
||||||
|
int main() {
|
||||||
|
scanf("%d", &t);
|
||||||
|
while (t--) {
|
||||||
|
scanf("%d", &n);
|
||||||
|
for (int i = 1; i <= n; i++)
|
||||||
|
scanf("%d", &a[i]);
|
||||||
|
f[0] = 1;
|
||||||
|
for (int i = 1; i <= n; i++) {
|
||||||
|
int k = i + 1;
|
||||||
|
for (int j = 0; j <= i; j++)
|
||||||
|
nxt[j] = i + 1;
|
||||||
|
for (int j = i - 1; j >= 1; j--) {
|
||||||
|
while (k != i + 1 && a[k - 1] != a[j])
|
||||||
|
k = nxt[k];
|
||||||
|
if (a[k - 1] == a[j])
|
||||||
|
k--;
|
||||||
|
nxt[j] = k;
|
||||||
|
}
|
||||||
|
for (int j = i - 1; j >= 0; j--)
|
||||||
|
if (nxt[j + 1] == i + 1)
|
||||||
|
f[i] = (f[i] + f[j]) % mod;
|
||||||
|
}
|
||||||
|
printf("%lld\n", f[n]);
|
||||||
|
memset(f, 0, sizeof(f[0]) * (n + 1));
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
KMP
|
||||||
|
ABA.rev = A.rev + B.rev + A.rev
|
||||||
|
*/
|
||||||
+84
@@ -0,0 +1,84 @@
|
|||||||
|
# CF2205E Simons and Dividing the Rhythm
|
||||||
|
|
||||||
|
## 题目描述
|
||||||
|
|
||||||
|
我紧握手中的烦恼,然后将它们抛向千里之外。
|
||||||
|
|
||||||
|
—— SHUN,《ONMYWAY》
|
||||||
|
|
||||||
|
假设 Simons 有一个长度为 $m$ 的数组 $a$。
|
||||||
|
|
||||||
|
Simons 需要对该数组执行如下操作,且仅能执行一次:
|
||||||
|
|
||||||
|
- 首先,他需要选择一个整数 $k$,并选定 $k$ 对整数 $[l_1, r_1], [l_2, r_2], \ldots, [l_k, r_k]$,使得:
|
||||||
|
- 对每个 $1\le i\le k$,都有 $l_i\le r_i$;
|
||||||
|
- $l_1=1$,$r_k=m$;
|
||||||
|
- 对每个 $i$($1 \leq i < k$),$r_i+1=l_{i+1}$。
|
||||||
|
- 然后,他分别将每个子数组 $[a_{l_i}, a_{l_i+1},\ldots, a_{r_i}]$ 独立地进行翻转。操作后,数组会变成 $[a_{r_1}, a_{r_1-1},\ldots, a_{l_1}, a_{r_2}, \ldots, a_{l_{k-1}}, a_{r_k}, a_{r_k-1}, \ldots, a_{l_k}]$。
|
||||||
|
|
||||||
|
现给定一个长度为 $n$ 的数组 $T$。请你统计有多少个数组 $S$,经过 Simons 执行如上的一次操作后,可以变换为 $T$。答案对 $998\,244\,353$ 取模。
|
||||||
|
|
||||||
|
## 输入格式
|
||||||
|
|
||||||
|
每组测试包含若干测试用例。第一行包含整数 $t$($1 \le t \le 8000$),表示测试用例的数量。
|
||||||
|
|
||||||
|
接下来每组测试包含:
|
||||||
|
|
||||||
|
第一行是一个整数 $n$($1 \le n \le 8000$),表示 $T$ 的长度。
|
||||||
|
|
||||||
|
第二行有 $n$ 个整数 $T_1, T_2, \ldots, T_n$($1\le T_i \le 8000$),表示数组 $T$ 的元素。
|
||||||
|
|
||||||
|
保证所有测试用例中 $n$ 的总和不超过 $8000$。
|
||||||
|
|
||||||
|
## 输出格式
|
||||||
|
|
||||||
|
对于每个测试用例,输出一个整数,表示满足条件的数组 $S$ 的数量,答案对 $998\,244\,353$ 取模。
|
||||||
|
|
||||||
|
## 输入输出样例 #1
|
||||||
|
|
||||||
|
### 输入 #1
|
||||||
|
|
||||||
|
```
|
||||||
|
5
|
||||||
|
4
|
||||||
|
1 1 2 1
|
||||||
|
4
|
||||||
|
1 2 3 1
|
||||||
|
6
|
||||||
|
1 3 2 3 3 2
|
||||||
|
10
|
||||||
|
2 3 1 4 3 1 4 3 1 2
|
||||||
|
1
|
||||||
|
8000
|
||||||
|
```
|
||||||
|
|
||||||
|
### 输出 #1
|
||||||
|
|
||||||
|
```
|
||||||
|
4
|
||||||
|
7
|
||||||
|
22
|
||||||
|
383
|
||||||
|
1
|
||||||
|
```
|
||||||
|
|
||||||
|
## 说明/提示
|
||||||
|
|
||||||
|
对于第一个测试用例,只有如下几种数组能够被变换为 $T$:
|
||||||
|
|
||||||
|
- 对于 $S=[2,1,1,1]$,Simons 选择 $[1,3]$ 和 $[4,4]$,操作后数组变为 $[1,1,2,1]$,等于 $T$。
|
||||||
|
- 对于 $S=[1,2,1,1]$,Simons 选择 $[1,4]$。
|
||||||
|
- 对于 $S=[1,1,2,1]$,Simons 选择 $[1,2]$、$[3,3]$ 和 $[4,4]$。
|
||||||
|
- 对于 $S=[1,1,1,2]$,Simons 选择 $[1,2]$ 和 $[3,4]$。
|
||||||
|
|
||||||
|
对于第二个测试用例,只有如下几种数组能够被变换为 $T$:
|
||||||
|
|
||||||
|
- 对于 $S=[1,1,3,2]$,Simons 选择 $[1,1]$ 和 $[2,4]$。
|
||||||
|
- 对于 $S=[1,2,1,3]$,Simons 选择 $[1,1]$、$[2,2]$ 和 $[3,4]$。
|
||||||
|
- 对于 $S=[1,2,3,1]$,Simons 选择 $[1,1]$、$[2,2]$、$[3,3]$ 和 $[4,4]$。
|
||||||
|
- 对于 $S=[1,3,2,1]$,Simons 选择 $[1,4]$。
|
||||||
|
- 对于 $S=[2,1,1,3]$,Simons 选择 $[1,2]$ 和 $[3,4]$。
|
||||||
|
- 对于 $S=[2,1,3,1]$,Simons 选择 $[1,2]$、$[3,3]$ 和 $[4,4]$。
|
||||||
|
- 对于 $S=[3,2,1,1]$,Simons 选择 $[1,3]$ 和 $[4,4]$。
|
||||||
|
|
||||||
|
由 ChatGPT 5 翻译
|
||||||
Reference in new issue
Block a user