CF954I Yet Another String Matching Problem 并查集、FFT

传送门

题意:给出两个由小写$a$到$f$组成的字符串$S$和$T$($|S| \geq |T|$),给出变换$c1\,c2$表示将两个字符串中所有$c1$字符变为$c2$,求$S$的每一个长度为$T$的子串与$T$做变换使得两个字符串相等的最小变换次数。$1 \leq |T| \leq |S| \leq 1.25 \times 10^5$


弱化版:CF939D

PS:默认字符串开头是第$0$位

我们同样考虑通过CF939D的那种方法解决这个问题。考虑到这道题的字符集大小只有$6$,也就是说本质不同的边的条数只有$30$条。我们可以考虑枚举$S$中的字符$x$与$T$中的字符$y$的连边情况。将$T$反序后,将$S$中的字符$x$对应为$1$,T中的字符$y$也对应为$1$,其他的都对应为$0$。然后对这两个对应的数组做$FFT$,这样得到的结果的第$x$位如果不为$0$,意味着$S$的以第$x - |T| + 1$位为开头的子串中存在$x$到$y$的连边(如果不是很理解可以自己画图qwq)。然后对每一个$S$的子串开并查集维护就可以了。复杂度$O(30nlogn)$

  1 #include<bits/stdc++.h>
  2 #define eps 1e-2
  3 #define ld long double
  4 //This code is written by Itst
  5 using namespace std;
  6 
  7 inline int read(){
  8     int a = 0;
  9     bool f = 0;
 10     char c = getchar();
 11     while(c != EOF && !isdigit(c)){
 12         if(c == '-')
 13             f = 1;
 14         c = getchar();
 15     }
 16     while(c != EOF && isdigit(c)){
 17         a = (a << 3) + (a << 1) + (c ^ '0');
 18         c = getchar();
 19     }
 20     return f ? -a : a;
 21 }
 22 
 23 const int MAXN = 265000;
 24 char s1[MAXN] , s2[MAXN];
 25 struct comp{
 26     ld x , y;
 27 
 28     comp(ld _x = 0 , ld _y = 0){
 29         x = _x;
 30         y = _y;
 31     }
 32 
 33     comp operator +(comp a){
 34         return comp(x + a.x , y + a.y);
 35     }
 36 
 37     comp operator -(comp a){
 38         return comp(x - a.x , y - a.y);
 39     }
 40 
 41     comp operator *(comp a){
 42         return comp(x * a.x - y * a.y , x * a.y + y * a.x);
 43     }
 44 }A[MAXN] , B[MAXN];
 45 const ld pi = acos(-1);
 46 int fa[MAXN][7] , ans[MAXN] , dir[MAXN] , need;
 47 
 48 inline void FFT(comp* a , int type){
 49     for(int i = 1 ; i < need ; ++i)
 50         if(i < dir[i])
 51             swap(a[i] , a[dir[i]]);
 52     for(int i = 1 ; i < need ; i <<= 1){
 53         comp wn(cos(pi / i) , type * sin(pi / i));
 54         for(int j = 0 ; j < need ; j += i << 1){
 55             comp w(1 , 0);
 56             for(int k = 0 ; k < i ; ++k , w = w * wn){
 57                 comp x = a[j + k] , y = a[i + j + k] * w;
 58                 a[j + k] = x + y;
 59                 a[i + j + k] = x - y;
 60             }
 61         }
 62     }
 63 }
 64 
 65 bool cmp(ld a , ld b){
 66     return a - eps < b && a + eps > b;
 67 }
 68 
 69 int find(int dir , int x){
 70     return fa[dir][x] == x ? x : (fa[dir][x] = find(dir , fa[dir][x]));
 71 }
 72 
 73 int main(){
 74 #ifndef ONLINE_JUDGE
 75     freopen("954I.in" , "r" , stdin);
 76     //freopen("954I.out" , "w" , stdout);
 77 #endif
 78     scanf("%s%s" , s1 , s2);
 79     int l1 = strlen(s1) , l2 = strlen(s2);
 80     for(int i = 0 ; i < (l2 >> 1) ; ++i)
 81         swap(s2[i] , s2[l2 - i - 1]);
 82     need = 1;
 83     while(need < l1 + l2 - 1)
 84         need <<= 1;
 85     for(int i = 0 ; i <= l1 - l2 ; ++i)
 86         for(int j = 1 ; j <= 6 ; ++j)
 87             fa[i][j] = j;
 88     for(int i = 1 ; i < need ; ++i)
 89         dir[i] = (dir[i >> 1] >> 1) | (i & 1 ? need >> 1 : 0);
 90     for(int i = 0 ; i <= 5 ; ++i)
 91         for(int j = 0 ; j <= 5 ; ++j)
 92             if(i != j){
 93                 for(int k = 0 ; k < need ; ++k){
 94                     A[k].x = s1[k] == 'a' + i;
 95                     A[k].y = 0;
 96                 }
 97                 for(int k = 0 ; k < need ; ++k){
 98                     B[k].x = s2[k] == 'a' + j;
 99                     B[k].y = 0;
100                 }
101                 FFT(A , 1);
102                 FFT(B , 1);
103                 for(int k = 0 ; k < need ; ++k)
104                     A[k] = A[k] * B[k];
105                 FFT(A , -1);
106                 for(int k = l2 - 1 ; k < l1 ; ++k)
107                     if(!cmp(A[k].x , 0))
108                         if(find(k - l2 + 1 , i + 1) != find(k - l2 + 1 , j + 1)){
109                             fa[k - l2 + 1][find(k - l2 + 1 , i + 1)] = find(k - l2 + 1 , j + 1);
110                             ++ans[k - l2 + 1];
111                         }
112             }
113     for(int i = 0 ; i <= l1 - l2 ; ++i)
114         printf("%d " , ans[i]);
115     return 0;
116 }

转载于:https://www.cnblogs.com/Itst/p/10040546.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生小兔问题

生小兔问题&#x1f430; 本文研究生小兔问题。使用代数模型&#xff0c;在考虑生育情况变化的情况下&#xff0c;求解兔子/白鼠的数目变化。 第1章 问题重述 生小兔问题 兔子出生后能够存活12个月&#xff0c;从第7月开始生小兔&#xff0c;7、8两月每对兔子生1对小兔/月&am…

光刻机龙头ASML回应韩国建厂:无需过度解读

来源&#xff1a; 深城物联近期&#xff0c;韩国在半导体领域的动作不小。先是韩国总统文在寅公开宣布韩国将斥资4500亿美元建设全球最大芯片制造基地&#xff0c;之后韩国又向全球光刻机龙头大厂阿斯麦&#xff08;ASML&#xff09;抛出了橄榄枝&#xff0c;请ASML在韩国建立再…

Spring入门之一-------实现一个简单的IoC

一、场景模拟 public interface Human {public void goHome();} Human&#xff1a;人类&#xff0c;下班了该回家啦public interface Car {void start();void stop();void turnLeft();void turnRight();} Car&#xff1a;汽车&#xff0c;可以启动、停止、左转、右转public cla…

常染色体的隐性疾病数学建模(代数模型)

常染色体的隐性疾病数学建模&#xff08;代数模型&#xff09; 摘要&#xff1a;本文研究随交配代数的增长&#xff0c;常染色体隐性疾病的基因分布变化问题。使用代数模型&#xff0c;在正常人不与显性患者交配&#xff0c;但隐性患者可与正常人、隐性患者交配的情况下时&…

一文拆解中国火星车着陆全过程

天问一号着陆器降落火星&#xff08;艺术图&#xff09;来源&#xff1a; 深城物联 经过惊心动魄的九分钟&#xff0c;中国首个火星车祝融号成功穿越火星大气层&#xff0c;着陆于火星北半球的乌托邦平原南端。自此&#xff0c;继苏联和美国之后&#xff0c;中国成为了第三个成…

VS Code 关于SFTP上传文件到多服务器的配置

工欲善其事&#xff0c;必先利其器&#xff01; 刚学前端的时候一直用的DW来编写代码&#xff0c;其功能非常强大&#xff0c;但在Linux下不能用&#xff0c;所以就转VS Code了。 但是刚开始使用VS Code的时候&#xff0c;很多DW上的功能需要自己安装扩展&#xff0c;并配置才可…

第二章 物理层 4 奈氏准则和香农定理 [计算机网络笔记]

第二章 物理层 4 奈氏准则和香农定理 本笔记参考书目&#xff1a; 计算机网络&#xff08;第8版&#xff09;谢希仁2021王道计算机网络视频公开课 本节重点&#xff1a; 奈氏准则和香农定理的计算/适用范围 转载请注明文章来源&#xff01; 失真 失真的影响因素&#xff1…

谈谈数学之现在与未来

文章来源&#xff1a;好玩的数学来源&#xff1a;《数学教学通讯》2005年3月&#xff08;上半月&#xff09;&#xff08;总第220期&#xff09;作者&#xff1a;王元&#xff08;中国科学院数学与系统科学研究院&#xff09;数学科学是什么&#xff1f;我们首先谈谈数学科学是…

SQL Server创建Job, 实现执行相同脚本而产生不同作业计划的探究

1 . 背景描述 本公司的SQL Server 服务器近百台&#xff0c;为了收集服务器运行的状态&#xff0c;需要在各个实例上部署监控Job&#xff0c;将收集到的信息推送到中央管理服务器。 收集的信息主要包括&#xff1a;慢查询、阻塞、资源等待、Connection_Trace log 、Job执行状态…

基于线性常微分方程的我国某省艾滋病传播的数学模型建立和预测分析

基于线性常微分方程的我国某省艾滋病传播的数学模型建立和预测分析 如有错误&#xff0c;欢迎指正&#xff01;转载需注明出处和作者信息&#xff01;©️Sylvan Ding 摘要 艾滋病&#xff08;AIDS&#xff09;又称获得性免疫缺陷综合征&#xff0c;由人类免疫缺陷病毒&…

神经网络的持续终身学习综述论文

来源&#xff1a;专知人和高级动物在整个生命中不断获取、微调和转让知识和技能。这种能力&#xff0c;称为lifelong learning&#xff0c;是由一系列神经认知机制协调的过程&#xff0c;这些机制共同促进了sensorimotor技能的发展以及对长期记忆的巩固和检索。因此对于计算系统…

Pensando Distributed Services Architecture [Pensando 分布式服务架构] - 翻译

Pensando Distributed Services Architecture [Pensando 分布式服务架构] - 翻译 转载需注明文章出处&#xff1a;©️ Sylvan Ding Source: M. Galles and F. Matus, “Pensando Distributed Services Architecture” in IEEE Micro, vol. 41, no. 02, pp. 43-49, 2021. D…

性能测试小总结(四) 结果分析(未完成)

结果分析 seleniumSelenium与QTP的比较 https://www.jianshu.com/p/593736bd44b3 Selenium web应用程序测试工具 功能 框架底层使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时&#xff0c;浏览器自动按照脚本代码做出点击&#xff0c;输入&#xff0c;打开&…

反思脑机接口技术:机器真的能控制我们的大脑吗?

来源&#xff1a;AI科技评论作者&#xff1a;R. Douglas Fields编译&#xff1a;陈彩娴猛烈的公牛在冲锋的途中锁定了双腿。它将双蹄扎进地下&#xff0c;在与之搏斗的人类参赛选手被刺伤之前停了下来。这个人类参赛选手不是职业斗牛士&#xff0c;而是一名西班牙神经科学家&am…

C4.5决策树生成算法完整版(Python),连续属性的离散化, 缺失样本的添加权重处理, 算法缺陷的修正, 代码等

C4.5决策树生成算法完整版(Python) 转载请注明出处&#xff1a;©️ Sylvan Ding ID3算法实验 决策树从一组无次序、无规则的事例中推理出决策树表示的分类规则&#xff0c;采用自顶向下的递归方式&#xff0c;在决策树的内部节点进行属性值的比较并根据不同的属性值判断从…

unittest单元测试笔记

单元测试 unittest单元测试是基于java的JUnit思想框架开发出来的测试框架 import unittest import HTMLTestRunner class Mytest1(unittest.TestCase):def test_a(self):#用例必须已test开头self.assertEqual(1,1,msg错误提示信息,如果校验失败,出现这个)print(a)def test_c(s…

缅怀袁隆平院士:一颗稻谷里的爱国情怀

来源&#xff1a;科学网5月22日&#xff0c;《中国科学报》从中国工程院获悉&#xff0c;“共和国勋章”获得者、中国工程院院士袁隆平&#xff0c;因多器官功能衰竭&#xff0c;于2021年5月22日13时07分在长沙逝世&#xff0c;享年91岁。袁隆平对于国人来说&#xff0c;袁隆平…

k-Means——经典聚类算法实验(Matlab实现)

聚类算法—k-Means实验 k-平均&#xff08;k-Means&#xff09;&#xff0c;也被称为k-均值&#xff0c;是一种得到最广泛使用的聚类算法[1]. k-Means算法以k为参数&#xff0c;把n个对象分为k个簇&#xff0c;使得簇内具有较高的相似度。 实验目的 了解常用聚类算法及其优缺…

这5个数学猜想最早在30年前提出,如今AI证明它们都错了

来源&#xff1a;AI科技评论编译&#xff1a;琰琰编辑&#xff1a;青暮近日&#xff0c;以色列特拉维夫大学研究团队在预印论文库提交了一篇名为“Constructions in combinatorics via neural networks“的论文&#xff0c;在这篇论文中&#xff0c;研究人员通过机器学习算法证…

Java AQS 核心数据结构-CLH 锁及优化

Java AQS 核心数据结构-CLH 锁 什么是CLH锁 CLH 锁是对自旋锁的一种改进&#xff0c;有效的解决了以上的两个缺点。 第一个是锁饥饿问题。在锁竞争激烈的情况下&#xff0c;可能存在一个线程一直被其他线程”插队“而一直获取不到锁的情况。第二是性能问题。在实际的多处理上…