题意

  • Another String | HDU7015 | 杭电多校五 04题
    我们说两个序列 a,ba,ba,b 是 kkk 匹配的,当且仅当 ∣a∣=∣b∣|a|=|b|∣a∣=∣b∣
    且 ∑i[ai≠bi]≤k\sum_{i} [a_i\ne b_i]\le k∑i​[ai​​=bi​]≤k ,即最多有 kkk 个位置不同
    给定一个字符串 SSS 和 kkk
    你需要求出 ∀i∈[1,∣S∣−1]\forall i\in[1,|S|-1]∀i∈[1,∣S∣−1],串 S[1,i]S[1,i]S[1,i] 的一个子串 aaa 与 串 S[i+1,∣S∣]S[i+1,|S|]S[i+1,∣S∣] 的一个子串 bbb 是 kkk 匹配的,问有多少种方案
  • 2≤∣S∣≤30002\le |S|\le 30002≤∣S∣≤3000
    0≤k≤30000\le k\le 30000≤k≤3000

思路

  • 感觉字符串匹配,可能就是字符串或者卷积的题 (???) 就不敢去看
    但是其实这题的做法比较偏想法
  • 首先我们很难按照 i=1∼∣S∣−1i=1\sim |S|-1i=1∼∣S∣−1 去分类讨论做
    不妨设目前我们有两个子串 [L1,R1][L1,R1][L1,R1] 与 [L2,R2][L2,R2][L2,R2] 是 kkk 匹配的
    那么我们能扩展或收缩到那些其他的子串,保证一定合法的呢?
  • 容易想到,如果 L1,R1L1,R1L1,R1 向右移动一段距离,然后所有合法的子串中,会有许多重复
    那么我们就固定左端点,计算此时有多少合法的右端点
  • 然后去考虑,每一个合法的子串对那些 iii 有贡献
  • 对于第一个区间 [L1,R1][L1,R1][L1,R1],我们对 i=L1∼L2−1i=L1\sim L2-1i=L1∼L2−1 都有 111 的贡献
    对于第 xxx 个区间 [L1+x−1,R1][L1+x-1,R1][L1+x−1,R1],我们对 i=L1+x−1∼L2−1i=L1+x-1\sim L2-1i=L1+x−1∼L2−1 都有 111 的贡献
  • 考虑怎么去快速累加贡献
    如果只是对一段区间 [x,y][x,y][x,y] 全部有 +1+1+1 的贡献,我们可以用线段树,也可以用差分数组 de[x]+1,de[y+1]−1de[x]+1,de[y+1]-1de[x]+1,de[y+1]−1 去做
    但是我们会有 xxx 个区间去做,容易想到去用二阶等差 让 de2[L1]+1,de2[R1+1]−1de2[L1]+1,de2[R1+1]-1de2[L1]+1,de2[R1+1]−1
    然后我们让一阶等差 de[L2]−(R1−L1+1)de[L2]-(R1-L1+1)de[L2]−(R1−L1+1) ,这样就可以达到我们的要求
  • 然后就是,对于所有的左端点 L1L1L1,我们需要找到最大的 R1R1R1 和另一个 L2L2L2,满足上述区间有 kkk 个不同的位置,或者扩到不能扩为止
    容易想到这是一个尺取,也就是我们的 [L1,R1][L1,R1][L1,R1] 可以在 O(∣S∣)O(|S|)O(∣S∣) 内枚举完
    那么久剩下 L2L2L2 没有枚举了,我们令 L2=L1+xL2=L1+xL2=L1+x ,枚举这个 xxx ,即可枚举到所有的情况

代码

  • 时间复杂度:O(∣S∣2)O(|S|^2)O(∣S∣2)
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
using namespace std;
typedef long long ll;
void show(){std::cerr << endl;}template<typename T,typename... Args>void show(T x,Args... args){std::cerr << "[ " << x <<  " ] , ";show(args...);}const int MAX = 3e3+50;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const double EPS = 1e-5;char ss[MAX];
int de1[MAX],de2[MAX];
int main()
{int T;scanf("%d",&T);while(T--){int n,k;scanf("%d%d",&n,&k);scanf("%s",ss+1);for(int i = 0;i <= n+1;++i)de1[i] = de2[i] = 0;for(int cha = 1;cha <= n-1;++cha){int L1 = 1,L2 = L1 + cha;int R1 = L1-1,R2 = L2-1;int now = 0;while(L2 <= n){while(R1+1 <= L2-1 && R2+1 <= n){if(ss[R1+1] == ss[R2+1])R1++,R2++;else if(now < k)now++,R1++,R2++;else break;}if(L1 <= R1 && now <= k){int len = R1 - L1 + 1;de2[L1]++;de2[R1+1]--;de1[L2]-=len;if(ss[L1] != ss[L2])now--;L1++;L2++;}else{L1++;L2++;R1 = L1;R2 = L2;if(ss[L1] == ss[L2])now = 0;else now = 1;}}}ll tmp = 0,ans = 0;for(int i = 1;i <= n;++i)tmp += de2[i],de1[i] += tmp;tmp = 0;for(int i = 1;i < n;++i)ans += de1[i],printf("%lld\n",ans);}return 0;
}

【训练题55:尺取 + 高阶等差】Another String | HDU7015 | 杭电多校五 04题相关推荐

  1. 【训练题48:想法 + 模拟】Lawn of the Dead | HDU6992 | 杭电多校四 08题

    题意 [2021"MINIEYE杯"中国大学生算法设计超级联赛(4)]Lawn of the Dead | HDU6992 n×mn\times mn×m 的网格 有 kkk 个土 ...

  2. 【2022杭电多校5 1012题 Buy Figurines】STL的运用

    题目描述 输入 输出 样例输入 1 5 3 2 4 1 3 5 1 3 4 4 2 样例输出 7 题意 有n个人去买东西,有m个窗口,每个人都有到达时间和花费时间,每个人到的时候都是挑一条人少的队排, ...

  3. 杭电多校第六场个人补题6 7 9 10 12

    杭电多校第六场个人补题6 7 9 10 12 6 题意 给定一棵有n结点的树,点权为1~n,求对所有结点子树的mex操作和的最大值 思路 其实就是从最底部开始网上找,由于0是唯一的一个,所欲最好给在最 ...

  4. 杭电计算机复试面试题库,杭电电子分院历年复试题(整理版)

    杭电电子分院历年复试题(整理版) 这个是我自己整理的,希望大家喜欢... 06年的 1.名词解释: CDMASOCDSPVHDL3G 2.写出3种以上的EDA开发工具,年并说明其特点 3.有2个单刀双 ...

  5. 杭电计算机复试面试题库,杭电电子分院历年复试题(整理版).doc

    杭电电子分院历年复试题(整理版).doc (2页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 杭电电子分院历年复试题(整理版)这个是我 ...

  6. 2021杭电多校补题——第一场

    2021杭电多校补题--第一场 文章目录 Mod, Or and Everything Rocket land(待补) Puzzle loop(待补) Another thief in a Shop( ...

  7. 【2019杭电多校训练赛】HDU6681 / 1002-Rikka with Cake 题解(扫描线)

    [2019杭电多校训练赛]HDU6681 / 1002-Rikka with Cake 题解 题意 思路 代码 题目来自于:HDU6681 Rikka with Cake 题意 题目的大意是给定你一个 ...

  8. 2019年杭电多校第一场 1001题blank(DP)HDU6578

    2019年杭电多校第一场 1001题blank(DP)HDU6578 解决思路,开一个DP数组来存储0 1 2 3四个字符最后出现的位置,并且在DP中已经==排好序==. DP开四维,DP[i][j] ...

  9. JAVA爬虫练习~通过杭电oj账号查询做题数

    1 首先我们来看一下 效果: 通过查找我们得到 了AC做题数 , 我们爬取HTML代码 , 通过自己的逻辑 筛选 所需要的信息 接下来是代码: package day_1;import java.io ...

  10. 2021杭电多校第八场补题

    比赛传送门:Contest Problem List (hdu.edu.cn) 1006)GCD Game 题目翻译:爱丽丝和鲍勃正在玩游戏. 他们轮流操作.有n个数字,a1,a2,...,an.每次 ...

最新文章

  1. C++ 设计Date类
  2. 设置timeout限制在爬虫中的运用
  3. 平板电脑安装软件_分享一个将平板作为电脑分屏的软件(文末有链接)
  4. 颜宁的学生都已经副院长了!还发表了学校首篇Nature
  5. LeetCode数据库 180. 连续出现的数字
  6. C++中常量指针,指针常量(const 和*)的使用方法和理解方法
  7. postman使用之四:设置读取变量和切换环境
  8. 剑指offer例题分享--7
  9. 去年北京居民服务消费快速增长 占消费支出半壁江山
  10. PMP第十三章:项目相关方管理
  11. 开源python爬虫软件下载_33款可用来抓数据的开源爬虫软件工具
  12. Win7 每天定时关机
  13. SpringBoot实现短信验证码校验
  14. postfix dovecot邮件服务器搭建
  15. 给微信小程序配一个App如何?
  16. Python语法之文件操作思维导图
  17. 斥资75元,我搭建了自己的博客网站
  18. 互联网架构概述 互联网架构演变过程
  19. 大龄程序员该何去何从,35岁后的路在何方
  20. [HNOI2005]狡猾的商人

热门文章

  1. 一文读懂蓝牙低功耗BLE的应用市场
  2. 从DWG导入SKP后的封面问题
  3. MCMC算法学习总结
  4. gaussian软件linux下载,Gaussian软件下载地址及安装说明
  5. Linux中光驱对应的设备文件,Linux硬盘对应的设备文件
  6. 数据采集及采集工具八爪鱼的使用
  7. 小说全自动采集详细过程-支持各大开源小说CMS采集
  8. 137页Python学习笔记,全面总结看这一篇就够了
  9. 几纳米间风云:手机摄影的制高点争夺战
  10. 在uniapp中配置并colorui及阿里图标