最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

AtCoder Beginner Contest 249 E - RLE

2022-05-11 03:44 作者:Asunataisiki  | 我要投稿

題意:求滿足原長度為n,且經(jīng)過轉(zhuǎn)換規(guī)則之后長度嚴(yán)格小于n的原字符串有多少種

其中,轉(zhuǎn)換規(guī)則為,將連續(xù)的字母表示為原字母+字母個數(shù),例如aaa轉(zhuǎn)化為a3

思路:一眼dp,首先考慮暴力求解,dp%5Bi%5D%5Bj%5D表示原串長度為?i 且轉(zhuǎn)換長度后為?j 的數(shù)量,那么考慮在當(dāng)前長度i的情況下,在后面接一個長度為k的字符串(每個字母均相同),可以表示為dp%5Bi%5D%5Bj%5D%2B%3Ddp%5Bi-k%5D%5Bj-len(k)%5D*25,其中len(k)表示經(jīng)過轉(zhuǎn)換規(guī)則之后的長度,乘25的原因是,需要與原串最后一個字母不同,共有25中情況,可以發(fā)現(xiàn)這是個n%5E3的復(fù)雜度,需要優(yōu)化

這里面首先能想到的就是優(yōu)化?k

k%5Cin%20%5B1%2C10)%2Clen(k)%3D2

k%5Cin%20%5B10%2C100)%2Clen(k)%3D3

k%5Cin%20%5B100%2C1000)%2Clen(k)%3D4

k%5Cin%20%5B1000%2C10000)%2Clen(k)%3D5

發(fā)現(xiàn)k可以分區(qū)間了,所以f%5Bi%5D%5Bj%5D%20%3D%20(%5Csum_%7Bk%20%3D%201%7D%5E%7B9%7Df%5Bi%20%20-%20k%5D%5Bj-2%5D%2B%5Csum_%7Bk%20%3D%2010%7D%5E%7B99%7Df%5Bi-k%5D%5Bj-3%5D%2B...%2B%5Csum_%7Bk%20%3D%201000%7D%5E%7B9999%7Df%5Bi-k%5D%5Bj-5%5D%20)

用前綴和來優(yōu)化掉每一個求和

注意處理邊界,但是不懂為什么要在前綴和相減的時候加上p,不加就wa,加了就過了

#include<bits/stdc++.h>
#define endl '\n'
#define fr first
#define se second
#define mem(x, y) memset(x, y, sizeof x)
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int inf = 0x3f3f3f3f;
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
//右左上下
const int N = 3005;
LL f[N][N], sum[N][N];
///f表示長度為i的字符串,用計數(shù)法表示后長度為j的數(shù)量
///s表示長度為2 ~ i的字符串,用計數(shù)法表示后長度為j的數(shù)量

void solve()
{
 ? ?int n, p;
 ? ?cin >> n >> p;
 ? ?//f[0][0] = 1;
 ? ?for(int i = 1; i <= n; i++) {
 ? ? ? ?int k = 1 + to_string(i).size();
 ? ? ? ?if(k < n) {
 ? ? ? ? ? ?f[i][k] += 26; f[i][k] %= p;
 ? ? ? ?}
 ? ? ? ?///題目要求壓縮后的長度j < n,所以這里不取等
 ? ? ? ?for(int j = 2; j <= 2 * i && j < n; j++) {
 ? ? ? ? ? ?f[i][j] += 25 * (p + sum[max(0, i - 1)][max(0, j - 2)] - sum[max(0, i - 10)][max(0, j - 2)]) % p;
 ? ? ? ? ? ?f[i][j] += 25 * (p + sum[max(0, i - 10)][max(0, j - 3)] - sum[max(0, i - 100)][max(0, j - 3)]) % p;
 ? ? ? ? ? ?f[i][j] += 25 * (p + sum[max(0, i - 100)][max(0, j - 4)] - sum[max(0, i - 1000)][max(0, j - 4)]) % p;
 ? ? ? ? ? ?f[i][j] += 25 * (p + sum[max(0, i - 1000)][max(0, j - 5)] - sum[max(0, i - 10000)][max(0, j - 5)]) % p;
 ? ? ? ? ? ?f[i][j] %= p;
 ? ? ? ? ? ?sum[i][j] = sum[i - 1][j] + f[i][j];
 ? ? ? ? ? ?sum[i][j] %= p;
 ? ? ? ?}
 ? ?}
 ? ?LL ans = 0;
 ? ?for(int i = 1; i < n; i++) {
 ? ? ? ?ans += f[n][i];
 ? ? ? ?ans %= p;
 ? ?}
 ? ?cout << ans << endl;
}

int main() 
{
 ? ?std::ios::sync_with_stdio(false);
 ? ?std::cin.tie(0);
 ? ?int T = 1;
 ? ?//cin >> T;
 ? ?while(T--) solve();
 ? ?return 0;
}
// 315397365


AtCoder Beginner Contest 249 E - RLE的評論 (共 條)

分享到微博請遵守國家法律
会东县| 绥芬河市| 新兴县| 沾化县| 松溪县| 黑山县| 宿迁市| 沂源县| 峨山| 铁岭市| 吉安市| 嵩明县| 外汇| 高尔夫| 左云县| 集安市| 靖江市| 孝感市| 荣成市| 宁都县| 越西县| 绥滨县| 松原市| 申扎县| 雷波县| 柳林县| 昌黎县| 时尚| 红河县| 秦皇岛市| 苗栗县| 故城县| 河北省| 云南省| 安远县| 屏山县| 广饶县| 枣强县| 漳州市| 安平县| 丰镇市|