惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cloudbric
Cloudbric
Schneier on Security
Schneier on Security
V2EX - 技术
V2EX - 技术
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
O
OpenAI News
S
Security @ Cisco Blogs
Scott Helme
Scott Helme
Security Archives - TechRepublic
Security Archives - TechRepublic
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
T
Threatpost
Hacker News: Ask HN
Hacker News: Ask HN
Microsoft Azure Blog
Microsoft Azure Blog
Know Your Adversary
Know Your Adversary
博客园 - 三生石上(FineUI控件)
A
About on SuperTechFans
Forbes - Security
Forbes - Security
NISL@THU
NISL@THU
Security Latest
Security Latest
G
Google Developers Blog
D
Docker
T
Threat Research - Cisco Blogs
N
Netflix TechBlog - Medium
C
CERT Recently Published Vulnerability Notes
H
Help Net Security
B
Blog
Martin Fowler
Martin Fowler
N
News and Events Feed by Topic
Simon Willison's Weblog
Simon Willison's Weblog
Hacker News - Newest:
Hacker News - Newest: "LLM"
L
Lohrmann on Cybersecurity
Y
Y Combinator Blog
PCI Perspectives
PCI Perspectives
F
Fortinet All Blogs
MyScale Blog
MyScale Blog
Project Zero
Project Zero
爱范儿
爱范儿
Cisco Talos Blog
Cisco Talos Blog
博客园 - 聂微东
Hugging Face - Blog
Hugging Face - Blog
人人都是产品经理
人人都是产品经理
V
Vulnerabilities – Threatpost
P
Proofpoint News Feed
Cyberwarzone
Cyberwarzone
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
TaoSecurity Blog
TaoSecurity Blog
N
News | PayPal Newsroom
Recorded Future
Recorded Future

AirTouchの小站

DNSMgr——聚合管理所有域名DNS解析+自动续签SSL证书并部署 | AirTouchの小站 雨云香港服务器简单测评 | AirTouchの小站 七牛云 AI 狂送 token 实测到底怎么样 | AirTouchの小站 记一次博客被攻击 | AirTouchの小站 给你的 Artalk 评论区配置验证码和垃圾评论检测 | AirTouchの小站 抓紧上车!免费 E3 开发者账号又来了! | AirTouchの小站 Vercel & Cloudflare Worker 项目推荐(2) | AirTouchの小站 用 Zmail 搭建自己的临时邮箱 | AirTouchの小站 IPv6反解域名?手把手带你搞 | AirTouchの小站 AirTouchの小站 AirTouchの小站 AirTouchの小站 AirTouchの小站 AirTouchの小站 macOS Tahoe 26中Electron架构卡顿的临时解决方案 | AirTouchの小站 用Obsidian插件增强Stellar写作体验 | AirTouchの小站 复习一下最小生成树 | AirTouchの小站 2025苹果秋季发布会亮点总结 | AirTouchの小站 分享几个artalk邮件通知模板 | AirTouchの小站 博客的图片应该存哪啊? | AirTouchの小站 Pic Smaller——自部署压缩图片的利器 | AirTouchの小站 企业微信的自定义域名邮箱太香了 | AirTouchの小站 所有道听途说,终获眼见为实 | AirTouchの小站 修复Vercel部署hexo导致文章的更新时间错误 | AirTouchの小站 jsDelivr国内公益加速镜像分享 | AirTouchの小站 搭建自己的busuanzi访问量统计服务 | AirTouchの小站 用Vercel和Netlify反代你的网站 | AirTouchの小站 用EdgeOne配置反向代理 丢掉丑陋的端口号 | AirTouchの小站 拼好鸽香港4区nat机器:月付3.5还要啥自行车! | AirTouchの小站 博客的新域名——xsl.im | AirTouchの小站 如何搭建自己的EdgeOne优选域名 | AirTouchの小站 用EdgeOne加速CloudflareR2存储桶 | AirTouchの小站 EdgeOne自动化上传证书并部署 | AirTouchの小站 你需要把PicGo换成PicList了! | AirTouchの小站 Cursor屏蔽中国大陆?给你解决方案! | AirTouchの小站 使用 Cloudflare Workers 自动获取必应每日壁纸 | AirTouchの小站 题解:P9509『STA - R3』Aulvwc | AirTouchの小站 题解:P11140 [APC001] E - Linear Map | AirTouchの小站 Phira多人联机服务器搭建&使用教程 | AirTouchの小站 腾讯云EdgeOne免费CDN加速你的网站 | AirTouchの小站 Hexo 博客收录指南 | AirTouchの小站 题解:P12646 [KOI 2024 Round 1] 升序 | AirTouchの小站 Cloudflare CDN优选IP加速你的网站 | AirTouchの小站 Giffgaff在线生成esim二维码 | Giffgaff sim转eSIM指南 | AirTouchの小站 AirTouchの小站 AirTouchの小站 Hexo Stellar 主题装修笔记 | AirTouchの小站 AirTouchの小站 AirTouchの小站
AirTouchの小站
AirTouch, me@airtouch.top · 2025-01-17 · via AirTouchの小站

www.luogu.com.cn

https://www.luogu.com.cn/problem/P2679

老师上课刚讲完这道题,来这里长个估值分享一下,顺便加深记忆。

定义 dp 状态

fi,j,kf_{i,j,k} 表示从字符串 AA 的前 ii 个字符中,取出 kk 个非空子串,拼接后与字符串 BB 的前 jj 个字符相等的方案数。

状态转移

  1. 不取当前字符。
    若第 ii 个字符不属于当前子串,则有 fi,j,k+=fi−1,j,kf_{i,j,k}+=f_{i-1,j,k}
  2. 取当前字符, 拼接到新的子串。
    若从位置 i−p+1i-p+1ii 的子串等于 Bj−p+1:jB_{j-p+1:j} (即子串长度为 pp 且匹配成功),则有 fi,j,k+=fi−p,j−p,k−1f_{i,j,k}+=f_{i-p,j-p,k-1}。 

这里 pp 的范围取决于当前 AABB 的匹配情况。

预处理可匹配长度

可以预处理一个二维数组 ycli,jycl_{i,j},表示从 AiA_iBjB_j 开始,最长能匹配的长度,判断 AA 的某段子串与 BB 的某段子串是否匹配。

优化

  1. 接着我们可以发现,每次是修改 fi+1,j+1,k+1f_{i+1,j+1,k+1}fi+p,j+p,k+1f_{i+p,j+p,k+1} 的值,相当于是将一斜行上的值进行修改,所以可以进行差分。
  2. 由于只会从上一状态转移过来,所以可以把 kk 这一维滚掉:
  • fi,jf_{i,j} 表示当前状态。
  • 使用 gi,jg_{i,j} 辅助存储下一状态。
  • 在每次迭代 kk 时,将 ffgg 交换,清空 gg

代码实现

cpp
#include<bits/stdc++.h>
using namespace std;
int n,m,kk,ycl[1010][210],MOD=1000000007;
string a,b;
signed main(){
    cin.tie(0)->ios::sync_with_stdio(false);
    cin>>n>>m>>kk>>a>>b;
    vector<vector<int>> f(n+3,vector<int>(m+3,0));
    vector<vector<int>> g(n+3,vector<int>(m+3,0));
    f[0][0]=1;
    f[1][1]=-1;
    for(int i=0;i<=n;i++){
        for(int j=0;j<=m;j++){
            int t=1;
            while(i+t<=n&&j+t<=m&&a[i+t-1]==b[j+t-1]) t++;
            ycl[i][j]=t-1;
        }
    }
    // for(int i=0;i<=n;i++){
    //     for(int j=0;j<=m;j++){
    //         cout<<ycl[i][j]<<" ";
    //     }
    //     cout<<endl;
    // }
    for(int k=0;k<=kk;k++){
        for(int i=0;i<=n;i++){
            for(int j=0;j<=m;j++){
                int p=ycl[i][j];
                if(i!=0&&j!=0) f[i][j]=(f[i-1][j-1]+f[i][j])%MOD;
                // cout<<i<<" "<<j<<" "<<k<<" "<<f[i][j]<<endl;
                f[i+1][j]=(f[i+1][j]+f[i][j])%MOD;
                f[i+2][j+1]=(f[i+2][j+1]+MOD-f[i][j])%MOD;
                g[i+1][j+1]=(g[i+1][j+1]+f[i][j])%MOD;
                g[i+p+1][j+p+1]=(g[i+p+1][j+p+1]+MOD-f[i][j])%MOD;
            }
        }
        if(k==kk) cout<<f[n][m];
        swap(f,g);
        fill(g.begin(),g.end(),vector<int>(m+3,0));
    }
    return 0;
}