传送门

分析

我们先考虑暴力如何计算

对于S的子串SS,如果它有位置i使得SS[i] != T[i]那么我们就将两个字符之间用并查集连边

最后答案很明显就是并查集中所有边的个数

于是我们可以发现对于S[i] != T[j]衣服那个会在S的第i-j个子串连边

我们通过观察可以发现i - j = i - (m - j) +m

这是一个卷积的形式

于是我们枚举S和T中考虑的是那种字符然后卷积判断连边关系

最后进行之前说的并查集即可

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
const int mod = ;
const int g = ;
int fa[][];
char s[],ot[],t[];
int n,m,r[],len,N,a[],b[],G,ans[];
inline int pw(int x,int p){
int res=;
while(p){
if(p&)res=1ll*res*x%mod;
x=1ll*x*x%mod;
p>>=;
}
return res;
}
inline void ntt(int a[],int f){
register int i,j,k;
int now;
for(i=;i<n;++i)
if(i<r[i])swap(a[i],a[r[i]]);
for(i=;i<n;i<<=){
if(f==)now=g;
else now=G;
int wn=pw(now,(mod-)/(i<<));
for(j=;j<n;j+=(i<<)){
int w=,x,y;
for(k=;k<i;++k,w=1ll*w*wn%mod){
x=a[j+k],y=1ll*a[i+j+k]*w%mod;
a[j+k]=(x+y)%mod,a[i+j+k]=(x+mod-y)%mod;
}
}
}
}
inline int sf(int wh,int x){return fa[wh][x]==x?x:fa[wh][x]=sf(wh,fa[wh][x]);}
signed main(){
register int i,j,k;
int on,om;
G=pw(g,mod-);
scanf("%s",s);
scanf("%s",ot);
n=strlen(s),m=strlen(ot);
for(i=;i<m;++i)t[i]=ot[m-i-];
n--,m--;
on=n,om=m;
m+=n;
for(n=;n<=m;n<<=)len++;
for(i=;i<n;++i)r[i]=((r[i>>]>>)|((i&)<<(len-)));
for(i=om;i<=on;++i)
for(j=;j<;++j)fa[i-om][j]=j;
for(i=;i<;++i)
for(j=;j<;++j){
if(i==j)continue;
memset(a,,sizeof(a));
memset(b,,sizeof(b));
for(k=;k<=on;++k)a[k]=((s[k]-'a')==i);
for(k=;k<=om;++k)b[k]=((t[k]-'a')==j);
ntt(a,),ntt(b,);
for(k=;k<n;k++)a[k]=1ll*a[k]*b[k]%mod;
ntt(a,-);
int inv=pw(n,mod-);
for(k=;k<n;++k)a[k]=1ll*a[k]*inv%mod;
for(k=om;k<=on;++k)if(a[k]){
int x=sf(k-om,i),y=sf(k-om,j);
if(x==y)continue;
ans[k-om]++;
fa[k-om][x]=y;
}
}
for(i=om;i<=on;++i)printf("%d ",ans[i-om]);
return ;
}

954I Yet Another String Matching Problem的更多相关文章

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

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

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

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

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

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

  4. CF954I Yet Another String Matching Problem 并查集、FFT

    传送门 题意:给出两个由小写$a$到$f$组成的字符串$S$和$T$($|S| \geq |T|$),给出变换$c1\,c2$表示将两个字符串中所有$c1$字符变为$c2$,求$S$的每一个长度为$T ...

  5. Educational Codeforces Round 40 I. Yet Another String Matching Problem

    http://codeforces.com/contest/954/problem/I 给你两个串s,p,求上一个串的长度为|p|的所有子串和p的差距是多少,两个串的差距就是每次把一个字符变成另一个字 ...

  6. CF954I Yet Another String Matching Problem

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

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

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

  8. string matching(拓展KMP)

    Problem Description String matching is a common type of problem in computer science. One string matc ...

  9. NYOJ之Binary String Matching

    Binary String Matching 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述     Given two strings A and B, whose a ...

随机推荐

  1. Ubuntu 16.04配置OpenGL教程

    sudo apt-get install build-essential sudo apt-get install libgl1-mesa-dev sudo apt-get install libgl ...

  2. Django在Eclipse下配置启动端口号

    首先,在Eclipse左侧树形菜单中找到要更改端口号的项目: 然后,在这里右键选择属性,打开属性界面之后选择Run/Debug Setting,并在其中找到已有的启动项,如果没有可以新建或启动一次. ...

  3. java代码-----indexOf()方法--从字符串的某个字符的第一次出现的位子开始

    总结:方法是indedOf()方法.this  is my sister   //indexOf()方法是indexOf('m')==7 .那么就是字符m第一次出现的位置是顺数第7个,就会正常显示‘t ...

  4. H3C IRF2的三种配置情况

    H3C-IRF2-虚拟交换技术-强列鼻视看我文档不下载的呵呵.看了下面的东西你就会配IRF了. H3C-5120-HI  H3C-5120S   H3C5800 先到H3C官网上面看那些交换机支持IR ...

  5. orzdba_monitor.sh脚本使用

    1.orzdba_monitor.sh脚本使用 ./orzdba_monitor.sh 主要是用nohup同时在后台调用orzdba,启动下面三个命令 [root@node02 scripts]# p ...

  6. Code blocks调试教程

    特别声明:本教程已转移至百度经验:https://jingyan.baidu.com/article/6b182309939a87ba58e159bf.html 一.题外话 之前一直想用Code bl ...

  7. 浅谈PHP面向对象编程(九、设计模式)

    9.0 设计模式 在编写程序时经常会遇到一此典型的问题或需要完成某种特定需求,设计模式就是针对这些问题和需求,在大量的实践中总结和理论化之后优选的代码结构编程风格,以及解决问题的思考方式. 设计模式就 ...

  8. MySql——事务控制语言(DTL)

    什么是事务(控制台只能是内存的操作) 通常,在此之前,我们说,一条语句使用一个分号(;)来结束,并得到执行. 那么我们说,这个“一次性执行”的过程,可以称为“一个事务”. 简单来说,“一条sql语句, ...

  9. OpenLayers 3 之 地图控件(control)

    OpenLayers 3 之 地图控件(control) 地图控件(control)是指地图上比例尺,缩略图,拉近拉远的按钮,滚动控制条等控件,默认控件有三个,可以禁用. OpenLayers 3 之 ...

  10. 转载:详解在visual studio中使用git版本系统(图文)

    很多人已经在使用git(或正在转移到git上),在github.com上,也看到不少国内同学的开源项目,非常不错.但相关教程似乎不多,所以趁着我自己的开源项目源码托管(https://github.c ...