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)$
#include<bits/stdc++.h>
#define eps 1e-2
#define ld long double
//This code is written by Itst
using namespace std;
inline int read(){
;
;
char c = getchar();
while(c != EOF && !isdigit(c)){
if(c == '-')
f = ;
c = getchar();
}
while(c != EOF && isdigit(c)){
a = (a << ) + (a << ) + (c ^ ');
c = getchar();
}
return f ? -a : a;
}
;
char s1[MAXN] , s2[MAXN];
struct comp{
ld x , y;
comp(ld _x = , ld _y = ){
x = _x;
y = _y;
}
comp operator +(comp a){
return comp(x + a.x , y + a.y);
}
comp operator -(comp a){
return comp(x - a.x , y - a.y);
}
comp operator *(comp a){
return comp(x * a.x - y * a.y , x * a.y + y * a.x);
}
}A[MAXN] , B[MAXN];
);
] , ans[MAXN] , dir[MAXN] , need;
inline void FFT(comp* a , int type){
; i < need ; ++i)
if(i < dir[i])
swap(a[i] , a[dir[i]]);
; i < need ; i <<= ){
comp wn(cos(pi / i) , type * sin(pi / i));
; j < need ; j += i << ){
comp w( , );
; k < i ; ++k , w = w * wn){
comp x = a[j + k] , y = a[i + j + k] * w;
a[j + k] = x + y;
a[i + j + k] = x - y;
}
}
}
}
bool cmp(ld a , ld b){
return a - eps < b && a + eps > b;
}
int find(int dir , int x){
return fa[dir][x] == x ? x : (fa[dir][x] = find(dir , fa[dir][x]));
}
int main(){
#ifndef ONLINE_JUDGE
freopen("954I.in" , "r" , stdin);
//freopen("954I.out" , "w" , stdout);
#endif
scanf("%s%s" , s1 , s2);
int l1 = strlen(s1) , l2 = strlen(s2);
; i < (l2 >> ) ; ++i)
swap(s2[i] , s2[l2 - i - ]);
need = ;
)
need <<= ;
; i <= l1 - l2 ; ++i)
; j <= ; ++j)
fa[i][j] = j;
; i < need ; ++i)
dir[i] = (dir[i >> ] >> ) | (i & ? need >> : );
; i <= ; ++i)
; j <= ; ++j)
if(i != j){
; k < need ; ++k){
A[k].x = s1[k] == 'a' + i;
A[k].y = ;
}
; k < need ; ++k){
B[k].x = s2[k] == 'a' + j;
B[k].y = ;
}
FFT(A , );
FFT(B , );
; k < need ; ++k)
A[k] = A[k] * B[k];
FFT(A , -);
; k < l1 ; ++k)
))
, i + ) != find(k - l2 + , j + )){
fa[k - l2 + ][find(k - l2 + , i + )] = find(k - l2 + , j + );
++ans[k - l2 + ];
}
}
; i <= l1 - l2 ; ++i)
printf("%d " , ans[i]);
;
}
CF954I Yet Another String Matching Problem 并查集、FFT的更多相关文章
- CF954I Yet Another String Matching Problem(FFT+并查集)
给定两个字符串\(S,T\) 求\(S\)所有长度为\(|T|\)子串与\(T\)的距离 两个等长的串的距离定义为最少的,将某一个字符全部视作另外一个字符的次数. \(|T|<=|S|<= ...
- CF954I Yet Another String Matching Problem
传送门 每次操作可以把两个字符串中所有同一种字符变成另外一种 定义两个长度相等的字符串之间的距离为:使两个字符串相等所需要操作的次数的最小值 求 \(s\) 中每一个长度为 \(|t|\) 的连续子串 ...
- 【CF954I】Yet Another String Matching Problem(FFT)
[CF954I]Yet Another String Matching Problem(FFT) 题面 给定两个字符串\(S,T\) 求\(S\)所有长度为\(|T|\)的子串与\(T\)的距离 两个 ...
- Codeforces 954I Yet Another String Matching Problem(并查集 + FFT)
题目链接 Educational Codeforces Round 40 Problem I 题意 定义两个长度相等的字符串之间的距离为: 把两个字符串中所有同一种字符变成另外一种,使得两个 ...
- 954I Yet Another String Matching Problem
传送门 分析 我们先考虑暴力如何计算 对于S的子串SS,如果它有位置i使得SS[i] != T[i]那么我们就将两个字符之间用并查集连边 最后答案很明显就是并查集中所有边的个数 于是我们可以发现对于S ...
- Codeforces.954I.Yet Another String Matching Problem(FFT)
题目链接 \(Description\) 对于两个串\(a,b\),每次你可以选择一种字符,将它在两个串中全部变为另一种字符. 定义\(dis(a,b)\)为使得\(a,b\)相等所需的最小修改次数. ...
- A simple problem(并查集判环)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2497 题意:给定一些点和边的关系,判断S点是否 ...
- String Reconstruction (并查集)
并查集维护和我这个位置的字母连续的已经被填充的字母能到达的最右边的第一个还没有填充的位置,然后把这个位置填上应该填的东西,然后把这个位置和下一个位置连接起来,如果下一个位置还没有填,我就会把下一个位置 ...
- CodeForces 828C String Reconstruction(并查集思想)
题意:给你n个串,给你每个串在总串中开始的每个位置,问你最小字典序总串. 思路:显然这道题有很多重复填涂的地方,那么这里的时间花费就会特别高. 我们维护一个并查集fa,用fa[i]记录从第i位置开始第 ...
随机推荐
- 【读书笔记】iOS-Interface Builder
IBOutlet或IBAction符号对编译不产生任何影响,它们只是标记,用于告诉Xcode这些对象可以和UI控件进行关联,以便于在编辑Interface Builder上的UI控件的时候Xcode可 ...
- CSS3圆圈动画放大缩小循环动画效果
代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...
- 张钹院士:场景是当前AI产业化最大问题
张钹院士:场景是当前AI产业化最大问题 https://mp.weixin.qq.com/s/TLdoi9cnY-Crr0FVp2ah6g 在世界机器人大会“青年创新创业专题论坛”上,清华大学人工智能 ...
- 我的Java之旅 第三课 从Applet到JSP
一.Applet Applet是一种特殊的Java程序,它本身不能单独运行(因为本身没有main()),需要嵌入在一个HTML文件中,借助浏览器或者appletviewer来解释执行. App ...
- IOS7如何获取设备唯一标识
WWDC 2013已经闭幕,IOS7 Beta随即发布,界面之难看无以言表...,简直就是山寨Android. 更让IOS程序猿悲催的是,设备唯一标识的MAC Address在IOS7中也失效了. I ...
- python常用模块之re模块(正则)
python种的re模块常用的5种方法,分别是re.match re.search re.findall re.split re.sub. 在介绍五种方法之前,需要介绍一下正则的基础. . ...
- [20171128]rman Input or output Memory Buffers.txt
[20171128]rman Input or output Memory Buffers.txt --//做一个简单测试rman 的Input or output Memory Buffers. 1 ...
- tkinter中frame布局控件
frame控件 frame控件是将窗口分成好几个小模块,然后每个小模块中添加控件. 也就是将窗口合理的布局 由于和其他控件的操作基本一致,就不做注释了 import tkinter wuya = tk ...
- 使用 Array2XML把数组转成XML格式,有相同的节点
最近开发一个项目,需要调用第三方的接口,第三方提供的数据是xml,我直接使用Array2XML把php数组转成XML格式. XML格式如: <root> <body> < ...
- 利用PCA进行故障监测
利用PCA进行故障监测,传统的统计指标有两种:Hotelling-T2和平方预测误差(Squared prediction error, SPE).T2统计量反映了每个主成分在变化趋势和幅值上偏离模型 ...