正题

题目链接:https://www.luogu.com.cn/problem/P6793


题目大意

给出两个长度为nnn的字符串,取出他们所有长度为kkk的连续子串分别构成两个可重集合A,BA,BA,B。

你每次可以花费xxx点代价修改AAA中一个字符串长度为xxx的后缀,求至少花费多少代价能够使得两个集合完全相同。

1≤k≤n≤1.5×1051\leq k\leq n\leq 1.5\times 10^51≤k≤n≤1.5×105


解题思路

两个串S,TS,TS,T的匹配代价是max{k−LCP(S,T),0}max\{k-LCP(S,T),0\}max{k−LCP(S,T),0}

这个和之前有道题很像,沿用想法就是在后缀树上搞。

两个点的LCPLCPLCP可以在他们后缀树上的LCALCALCA处得到。

现在问题就变为了有一些黑白点,知道两个点匹配的代价与LCALCALCA的关系,求最小代价和。

基础贪心?直接在深度小的地方合并完就好了。

后缀树就是把反串跑广义SAM就好了

时间复杂度O(n)O(n)O(n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=6e5+10;
struct node{ll to,next;
}a[N];
ll n,k,tot,ls[N],v[N][2],ans;
ll ch[N][26],fa[N],len[N],cnt;
char sa[N],sb[N];
ll Insert(ll p,ll c){if(ch[p][c]){ll q=ch[p][c];if(len[p]+1==len[q])return q;ll nq=++cnt;len[nq]=len[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[nq]));fa[nq]=fa[q];fa[q]=nq;for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;return nq;}ll np=++cnt;len[np]=len[p]+1;for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;if(!p)fa[np]=1;else{ll q=ch[p][c];if(len[p]+1==len[q])fa[np]=q;else{ll nq=++cnt;len[nq]=len[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[nq]));fa[nq]=fa[q];fa[q]=fa[np]=nq;for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;}}return np;
}
void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(ll x){for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;dfs(y);v[x][0]+=v[y][0];v[x][1]+=v[y][1];}ll tmp=min(v[x][0],v[x][1]);ans+=max(k-len[x],0ll)*tmp;v[x][0]-=tmp;v[x][1]-=tmp;return;
}
signed main()
{scanf("%lld%lld",&n,&k);scanf("%s",sa+1);scanf("%s",sb+1);ll last=cnt=1;for(ll i=n;i>=1;i--)last=Insert(last,sa[i]-'a'),v[last][0]+=((n-i+1)>=k);last=1;for(ll i=n;i>=1;i--)last=Insert(last,sb[i]-'a'),v[last][1]+=((n-i+1)>=k);for(ll i=2;i<=cnt;i++)addl(fa[i],i);dfs(1);printf("%lld\n",ans);return 0;
}

P6793-[SNOI2020]字符串【广义SAM,贪心】相关推荐

  1. BZOJ 3277 串 BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析、启发式合并、线段树合并、主席树)...

    标签那么长是因为做法太多了... 题目链接: (bzoj 3277) https://www.lydsy.com/JudgeOnline/problem.php?id=3277 (bzoj 3473) ...

  2. BZOJ 3277 串 BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析)

    标签那么长是因为做法太多了... 题目链接: (bzoj 3277) https://www.lydsy.com/JudgeOnline/problem.php?id=3277 (bzoj 3473) ...

  3. 喵星球上的点名——记一个用广义SAM根号维护多串的技巧

    喵星球的上的点名 给定一个字符串集合S,每次给定T询问S中有多少个字符串中包含T,最后询问S中的每一个字符串包含了多少次给定的T. 思路 考虑将这S个字符串建立广义SAM,那么我们每次将T放到广义SA ...

  4. Luogu4022 CTSC2012 熟悉的文章 广义SAM、二分答案、单调队列

    传送门 先将所有模板串扔进广义SAM.发现作文的\(L0\)具有单调性,即\(L0\)更小不会影响答案,所以二分答案. 假设当前二分的值为\(mid\),将当前的作文放到广义SAM上匹配. 设对于第\ ...

  5. P4022-[CTSC2012]熟悉的文章【广义SAM,dp,单调队列】

    正题 题目链接:https://www.luogu.com.cn/problem/P4022 题目大意 给出mmm个模板串. 然后nnn次询问给出一个串SSS要求找到一个最大的LLL使得能够将SSS超 ...

  6. [2021.4.5多校省选模拟30]最小表示——map建边+广义SAM

    前言:虽然这题前面加了个括号是"省选模拟30",但是在accoders上是比赛"省选模拟31"里面的. 题目描述 题解 先贴出官方正解,是用的和后缀数组: 根据 ...

  7. SP8093 JZPGYZ - Sevenk Love Oimaster(广义SAM)

    SP8093 JZPGYZ - Sevenk Love Oimaster(广义SAM) 思路:广义 S A M SAM SAM构建文本串,然后用以一个 s z [ p ] sz[p] sz[p]表示状 ...

  8. YbtOJ#532-往事之树【广义SAM,线段树合并】

    正题 题目链接:https://www.ybtoj.com.cn/problem/532 题目大意 给出nnn个点的一个TrieTrieTrie树,定义SxS_xSx​表示节点xxx代表的字符串 求m ...

  9. CF204E-Little Elephant and Strings【广义SAM,线段树合并】

    正题 题目链接:https://www.luogu.com.cn/problem/CF204E 题目大意 nnn个字符串的一个字符串集合,对于每个字符串求有多少个子串是这个字符串集合中至少kkk个字符 ...

最新文章

  1. python3 命令行参数
  2. spring cloud config将配置存储在数据库中 1
  3. 一千个不用 Null 的理由,你还用?
  4. 在预加载新闻时,怎么去掉初始化内容的显示尴尬?
  5. 离散时间系统的相位响应
  6. Java黑皮书课后题第8章:*8.8(所有最近的点对)修改程序清单8-3,找出所有所有具有最小距离的点对。下面是一个运行示例
  7. 新手村之BOSS战-入门综合练习2
  8. main run方法没用_多线程:解决Runnable接口无start()方法的问题
  9. JAVA→JDBCJava DataBase Connectivity、存储过程Stored Procedure、事务Transaction、连接池DBCP C3P0、JDBC升级替代框架
  10. Sublime格式化代码快捷键
  11. JavaScript编程精解(笔记1)
  12. Inventory文件扩展
  13. 微信小程序 获取用户昵称 头像 性别...『并解决获取的头像模糊问题』
  14. 两部手机怎样才能把数据都传过来_新旧手机怎样互传数据?
  15. 十一、MYSQL数据库备份还原
  16. GIt远程仓库pull拉取代码
  17. simpread-机器人智能抓取 AI+Grasp
  18. 东方甄选双语直播火爆出圈,新东方转型初见端倪
  19. React+Redux技术栈核心要点解析(下篇)
  20. type接口和class的区别(类型和类)

热门文章

  1. inputstream是否一定要close_汽车加装行李架后,总被交警拦下,类似改装,是否一定要备案...
  2. 超详细图解!【MySQL进阶篇】SQL优化-索引-存储引擎
  3. 钣金缺口lisp_UG用钣金模块的放样创建天圆地方,还能学钣金展开,必看
  4. java mongodb 批量删除_MONGODB删除/新增/更改大量记录的方法
  5. 151. 翻转字符串里的单词(思路+详解)
  6. [MyBatisPlus]模拟多数据源环境及测试
  7. [蓝桥杯]错误票据---stringstream应用举例
  8. oracle 取英文排序,Oracle中中文、数字,英文混杂形式的字段进行排序的方法
  9. HashMap实现LRU(最近最少使用)缓存更新算法
  10. Legacy(线段树优化建边跑Dijkstra)