$FFT$套路题(然而我看错题了)
我们考虑化一下式子。
设当前比较的两个部分为$S[i....i+|T|-1]$和$T[0....|T|-1]$。
我们对串$T$中出现问号的位置全部赋值为$0$。
我们定义一个差异度$C[i]=\sum_{j=0}^{|T|-1}T[j](S[i+j]-T[j])^2$
显然当$C[i]$为$0$时,$S[i....i+|T|-1]$和$T[0....|T|-1]$可以实现匹配。
我们把式子拆开分析,则有
$C[i]=\sum_{j=0}{|T|-1}S[i+j]^2T[j]-2S[i+j]T[j]^2+T[j]^3$
然后我们将$T$串翻转一下,就会发现这个式子可以变成一个卷积的形式。
然后我们就可以用$FFT$去求出每一个$C[i]$,显然$T[i]^3$可以直接求。
完结撒花~
#include<bits/stdc++.h>
#define L long long
#define MOD 998244353
#define G 3
#define M 1<<18
using namespace std; L pow_mod(L x,L k){
L ans=;
for(;k;x=x*x%MOD,k>>=)
if(k&) ans=ans*x%MOD;
return ans;
} L a[M]={},b[M]={},aa[M]={},bb[M]={},ans[M]={}; int n; void change(L a[],int n){
for(int i=,j=;i<n-;i++){
if(i<j) swap(a[i],a[j]);
int k=n>>;
while(j>=k) j-=k,k>>=;
j+=k;
}
} void NTT(L a[],int n,int on){
change(a,n);
for(int h=;h<=n;h<<=){
L wn=pow_mod(G,(MOD-)/h);
for(int j=;j<n;j+=h){
L w=;
for(int k=j;k<j+(h>>);k++){
L u=a[k],t=w*a[k+(h>>)]%MOD;
a[k]=(u+t)%MOD;
a[k+(h>>)]=(u-t+MOD)%MOD;
w=w*wn%MOD;
}
}
}
if(on==-){
L inv=pow_mod(n,MOD-);
for(int i=;i<n;i++) a[i]=a[i]*inv%MOD;
reverse(a+,a+n);
}
} char s[M]={},c[M]={};
int lens,lenc,len=;
int main(){
scanf("%d%d",&lens,&lenc);
scanf("%s%s",s,c);
lens=strlen(s); lenc=strlen(c);
while(len<lens+lenc) len<<=;
reverse(c,c+lenc);
L sumb=;
for(int i=;i<lens;i++) a[i]=(s[i]-'a'+),aa[i]=a[i]*a[i];
for(int i=;i<lenc;i++) b[i]=(c[i]=='?'?:c[i]-'a'+),bb[i]=b[i]*b[i],sumb+=b[i]*b[i]*b[i];
sumb%=MOD;
NTT(a,len,); NTT(aa,len,);
NTT(b,len,); NTT(bb,len,);
for(int i=;i<len;i++) ans[i]=(aa[i]*b[i]%MOD-*a[i]*bb[i]%MOD+MOD)%MOD;
NTT(ans,len,-);
int sum=;
for(int i=lenc-;i<lens;i++)
if((ans[i]+sumb)%MOD==) sum++;
cout<<sum<<endl;
for(int i=lenc-;i<lens;i++)
if((ans[i]+sumb)%MOD==) printf("%d\n",i-lenc+);
}
【bzoj4503】 两个串 FFT的更多相关文章
-
bzoj4503: 两个串 bitset
目录 题目链接 题解 代码 题目链接 bzoj4503: 两个串 题解 暴一发bitset f[i][j] 表示 S[1..i] 是否有个后缀能匹配 T[1..j] 那么假设 S[i+1] 能匹配 T ...
-
【BZOJ4503】两个串 FFT
[BZOJ4503]两个串 Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有“?”字符,这个字符可以匹配任何字 ...
-
【bzoj4259/bzoj4503】残缺的字符串/两个串 FFT
bzoj4259 题目描述 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有 ...
-
BZOJ4259: 残缺的字符串 &; BZOJ4503: 两个串
[传送门:BZOJ4259&BZOJ4503] 简要题意: 给出两个字符串,第一个串长度为m,第二个串长度为n,字符串中如果有*字符,则代表当前位置可以匹配任何字符 求出第一个字符串在第二个字 ...
-
BZOJ 4503: 两个串 [FFT]
4503: 两个串 题意:兔子们在玩两个串的游戏.给定两个只含小写字母的字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有"?"字符,这个字符可以匹 ...
-
BZOJ4503: 两个串
Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有“?”字符,这个字符可以匹配任何字符. Input 两行两个字 ...
-
BZOJ4503 两个串 多项式 FFT
题目传送门 - BZOJ4503 题意概括 给定两个字符串S和T,回答T在S中出现了几次,在哪些位置出现.注意T中可能有?字符,可以匹配任何字符. 题解 首先,假装你已经知道了这是一道$FFT$题. ...
-
2019.02.06 bzoj4503: 两个串(fft)
传送门 题意简述:给两个字符串s,ts,ts,t,ttt中可能有通配符,问ttt在sss出现的次数和所有位置. 思路:一道很熟悉的题,跟bzoj4259bzoj4259bzoj4259差不多的. 然后 ...
-
BZOJ4503 两个串 【fft】
题目链接 BZOJ4503 题解 水水题. 和残缺的字符串那题几乎是一样的 同样转化为多项式 同样TLE 同样要手写一下复数才A #include<algorithm> #include& ...
随机推荐
-
java集合学生管理系统
//student.java package com.sran.www; import java.util.Arrays; import java.util.Scanner; public class ...
-
Unity4升级Unity5后Image Effects问题
Assets\Editor\Image Effects\CameraMotionBlurEditor.js 会出现Ambiguous reference 'preview'错误提示,解决方法 查找pr ...
-
View(三)
大家在平时使用View的时候都会发现它是有状态的,比如说有一个按钮,普通状态下是一种效果,但是当手指按下的时候就会变成另外一种效果,这样才会给人产生一种点击了按钮的感觉.当然了,这种效果相信几乎所有的 ...
-
Android笔记:真机调试无法输出Log 信息的问题
机器在出厂时将log的级别做了限制,方法是:拨号盘输入*20121220# -> 选择日志输出级别 -> 选择Java log level -> 选择LOGD即可. 方法是:拨号盘输 ...
-
zboot/piggyback.c
/* * linux/zBoot/piggyback.c * * (C) 1993 Hannu Savolainen */ /* * This program reads the c ...
-
wikioi 1206 保留两位小数 【考查浮点数输入输出】
/*======================================================================== 1206 保留两位小数 题目描述 Descript ...
-
在Blade中结合gperftools检查内存泄露
Blade是我们开发的大规模C++项目构建工具. gperftools是google开发的性能工具,由高效内存分配器,CPU性能分析器,堆分析器,堆检查器等工具组成. 和其他构建工具不同,结合gtes ...
-
严重: Could not synchronize database state with session org.hibernate.exception.DataException: Could not execute JDBC batch update
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco; color: #ff2600 } p.p2 { margin: 0.0px 0 ...
-
zabbix server总是stoped,找到此方法解决了问题
zabbix日志报错: One child process died (PID:8885,exitcode/signal:1). Exiting ... syncing history data... ...
-
VueJS第2天 初阅API(初识MarkDown)
指令是带有前缀 v-,以表示它们是 Vue 提供的特殊特性.可能你已经猜到了,它们会在渲染的 DOM 上应用特殊的响应式行为 v-bind --> 数据绑定 v-for --> 循环 v- ...