传送门

题意:给出两个由小写$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的更多相关文章

  1. CF954I Yet Another String Matching Problem(FFT+并查集)

    给定两个字符串\(S,T\) 求\(S\)所有长度为\(|T|\)子串与\(T\)的距离 两个等长的串的距离定义为最少的,将某一个字符全部视作另外一个字符的次数. \(|T|<=|S|<= ...

  2. CF954I Yet Another String Matching Problem

    传送门 每次操作可以把两个字符串中所有同一种字符变成另外一种 定义两个长度相等的字符串之间的距离为:使两个字符串相等所需要操作的次数的最小值 求 \(s\) 中每一个长度为 \(|t|\) 的连续子串 ...

  3. 【CF954I】Yet Another String Matching Problem(FFT)

    [CF954I]Yet Another String Matching Problem(FFT) 题面 给定两个字符串\(S,T\) 求\(S\)所有长度为\(|T|\)的子串与\(T\)的距离 两个 ...

  4. Codeforces 954I Yet Another String Matching Problem(并查集 + FFT)

    题目链接  Educational Codeforces Round 40  Problem I 题意  定义两个长度相等的字符串之间的距离为:   把两个字符串中所有同一种字符变成另外一种,使得两个 ...

  5. 954I Yet Another String Matching Problem

    传送门 分析 我们先考虑暴力如何计算 对于S的子串SS,如果它有位置i使得SS[i] != T[i]那么我们就将两个字符之间用并查集连边 最后答案很明显就是并查集中所有边的个数 于是我们可以发现对于S ...

  6. Codeforces.954I.Yet Another String Matching Problem(FFT)

    题目链接 \(Description\) 对于两个串\(a,b\),每次你可以选择一种字符,将它在两个串中全部变为另一种字符. 定义\(dis(a,b)\)为使得\(a,b\)相等所需的最小修改次数. ...

  7. A simple problem(并查集判环)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2497 题意:给定一些点和边的关系,判断S点是否 ...

  8. String Reconstruction (并查集)

    并查集维护和我这个位置的字母连续的已经被填充的字母能到达的最右边的第一个还没有填充的位置,然后把这个位置填上应该填的东西,然后把这个位置和下一个位置连接起来,如果下一个位置还没有填,我就会把下一个位置 ...

  9. CodeForces 828C String Reconstruction(并查集思想)

    题意:给你n个串,给你每个串在总串中开始的每个位置,问你最小字典序总串. 思路:显然这道题有很多重复填涂的地方,那么这里的时间花费就会特别高. 我们维护一个并查集fa,用fa[i]记录从第i位置开始第 ...

随机推荐

  1. Windows下使用Rtools编译R语言包

    使用devtools安装github中的R源代码时,经常会出各种错误,索性搜了一下怎么在Windows下直接打包,网上的资料也是参差不齐,以下是自己验证通过的. 一.下载Rtools 下载地址:htt ...

  2. 《ASP.NET MVC企业实战》(三)MVC开发前奏

    ​ 在上一篇“<ASP.NET MVC企业级实战>(二)MVC开发前奏”中跟随作者大概了解了一些C#3.0和3.5中的新特性.本篇继续以这样的方式来学习C#中的一些特性.   一.C#3. ...

  3. 为Hexo Next主题添加分享及打赏功能

    博客地址:往事亦如风的博客 要想先看打赏和分享功能效果,请移步我的博客 打赏功能 因为next主题自带打赏功能,所以我们只需要在next的主题配置文件中找到如下代码,image文件夹是我在blog/s ...

  4. ADOBE ACROBAT 去除Explorer右键菜单

    运行以下命令: regsvr32 -u "C:\Program Files (x86)\Adobe\Acrobat 10.0\Acrobat Elements\ContextMenu64.d ...

  5. yum-config-manager命令找不到

    安装: 命令在yum-utils 包里,安装既可以解决:yum -y install yum-utils 当然你也可以通过 dnf 替代 dnf 命令替代: 禁用仓库命令就是: dnf config- ...

  6. linux中crw brw lrw等等文件属性是什么

    今天在查看 /dev/fuse 文件的属性的时候,看到了crw_ 权限位,一时反应不过来: [root@localhost ~]# ll /dev/fuse crw-rw-rw-. root root ...

  7. godaddy.com 都转到 www.dnspod.cn

    我们在godaddy上注册了域名,但因为godaddy对域名解析的诸多限制和缓慢. 所以必需把域名服务器更改为dnspod上,然后再在dnspod上做A记录,CNAME等设置都很方便.

  8. Shell的基础介绍和案例

    一.shell脚本基础 1.第一个脚本 vim  first.sh 分别使用三种方法可以执行脚本:   ./first.sh (需要有可执行的权限)   sh    first.sh   .  fir ...

  9. 17秋 软件工程 团队第五次作业 Alpha Scrum4

    17秋 软件工程 团队第五次作业 Alpha Scrum4 今日完成的任务 世强:部门基础信息模块数据更新.部门审核提交: 港晨:设计编写登录界面的一部分: 树民:学习python基本语法.flask ...

  10. WPF防止重复运行实例

    1.方法一 在app.xaml.cs下添加如下代码: /// <summary> /// App.xaml 的交互逻辑 /// </summary> public partia ...