954I Yet Another String Matching Problem
分析
我们先考虑暴力如何计算
对于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的更多相关文章
- Codeforces 954I Yet Another String Matching Problem(并查集 + FFT)
题目链接 Educational Codeforces Round 40 Problem I 题意 定义两个长度相等的字符串之间的距离为: 把两个字符串中所有同一种字符变成另外一种,使得两个 ...
- Codeforces.954I.Yet Another String Matching Problem(FFT)
题目链接 \(Description\) 对于两个串\(a,b\),每次你可以选择一种字符,将它在两个串中全部变为另一种字符. 定义\(dis(a,b)\)为使得\(a,b\)相等所需的最小修改次数. ...
- 【CF954I】Yet Another String Matching Problem(FFT)
[CF954I]Yet Another String Matching Problem(FFT) 题面 给定两个字符串\(S,T\) 求\(S\)所有长度为\(|T|\)的子串与\(T\)的距离 两个 ...
- CF954I Yet Another String Matching Problem 并查集、FFT
传送门 题意:给出两个由小写$a$到$f$组成的字符串$S$和$T$($|S| \geq |T|$),给出变换$c1\,c2$表示将两个字符串中所有$c1$字符变为$c2$,求$S$的每一个长度为$T ...
- Educational Codeforces Round 40 I. Yet Another String Matching Problem
http://codeforces.com/contest/954/problem/I 给你两个串s,p,求上一个串的长度为|p|的所有子串和p的差距是多少,两个串的差距就是每次把一个字符变成另一个字 ...
- CF954I Yet Another String Matching Problem
传送门 每次操作可以把两个字符串中所有同一种字符变成另外一种 定义两个长度相等的字符串之间的距离为:使两个字符串相等所需要操作的次数的最小值 求 \(s\) 中每一个长度为 \(|t|\) 的连续子串 ...
- CF954I Yet Another String Matching Problem(FFT+并查集)
给定两个字符串\(S,T\) 求\(S\)所有长度为\(|T|\)子串与\(T\)的距离 两个等长的串的距离定义为最少的,将某一个字符全部视作另外一个字符的次数. \(|T|<=|S|<= ...
- string matching(拓展KMP)
Problem Description String matching is a common type of problem in computer science. One string matc ...
- NYOJ之Binary String Matching
Binary String Matching 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Given two strings A and B, whose a ...
随机推荐
- CentOS部署NetCore - 1. 安装CentOS 7 & 安装 Nginx
1. 环境: Win7 64bit 2. 准备: VMWare(12.0.0 build-2985596) CentOS 7 Minimal ISO (http://isoredirect.cento ...
- vc中edit控件使用总结
通过类向导可以生成两种类成员变量,一种是cstring类型,一种是cedit类型.在程序中使用时如果只是简单的获取 edit控件内容,或设置简单的内容建议使用cstring类型成员变量.示例:CStr ...
- HDOJ4763(KMP原理理解)
Theme Section Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- Spring Framework中常见的事务传播陷阱(译文)
最近看到Medium上一篇讨论Spring Framework中事务传播的文章,解释了几种常见的问题,解释的不错,这里直接翻译吧(意译为主,粗体和斜体是我自己加上的). 译文: 这是我的第一篇文章,我 ...
- java 重写 与 重载 用法
图例: 重写: 其实就是获取其他类 和自己类相同的方法名 来使用 重载: 其实就是创建多个相同的方法名,里面装载不同的参数 重写例子: Super关键字 重载的例子:
- Nginx限制服务地址
今天要在Nginx上设置禁止通过IP访问服务器,只能通过域名访问,这样做是为了避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网,从网络上搜到以下解决方案. 我们在使用的时候会遇到很多的恶 ...
- ESXI root密码忘记,重置root密码
今天遇到了一个叫人比较头疼的问题,早在一个月前公司拉来一台服务器,闲着没事我给装成了Esxi的虚拟机系统了,时间过久忘了当时设定的密码为何?故而翻了许久的资料,终于找好的方向,准备重置系统密码.准备搞 ...
- 【做题记录】USACO silver * 50(第一篇)
由于我太菜,决定按照AC人数从小到大慢慢做. BZOJ开了权限号真的快了好多诶~ 29/50 1606: [Usaco2008 Dec]Hay For Sale 购买干草 背包dp 1610: [Us ...
- PHP如何知道一个类中所有的方法
当我们使用一个类时既没有源码也没有文档时(尤其是php扩展提供的类,比如mysqli,Redis类),我们该怎么知道这个类中提供了哪些方法,以及每个方法该怎么使用呢,此时就该PHP中强大的反射登场了, ...
- processlist中最哪些状态要引起关注
一般而言,我们在processlist结果中如果经常能看到某些SQL的话,至少可以说明这些SQL的频率很高,通常需要对这些SQL进行进一步优化. 今天我们要说的是,在processlist中,看到哪些 ...