【bzoj4503】 两个串 FFT
$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& ...
随机推荐
- 关于document.write(来自网络)
对象属性: document.title //设置文档标题等价于HTML的<title>标签document.bgColor / ...
- 2018.10.16 NOIP模拟 华莱士(并查集)
传送门 按照题意模拟维护最小的环套树森林就行了. 然而考试的时候naivenaivenaive瞎写了一个错误的贪心. 代码
- 2018.10.01 NOIP模拟 购买书籍(贪心+STL)
传送门 一道有意思的贪心. 感觉使用了网络流推流反悔的思想. 考虑维护三个setsetset维护a[i]−b[i],b[i]a[i]-b[i],b[i]a[i]−b[i],b[i]和a[i]a[i]a ...
- Django入门与实践-第23章:分页实现(完结)
http://127.0.0.1:8000/boards/1/ #从现在起,我们将在 board_topics 这个视图中来操作. python manage.py shell from django ...
- UVa 11491 Erasing and Winning (贪心,单调队列或暴力)
题意:给一个数字(开头非0),拿掉其中的d个数字,使剩下的数字最大(前后顺序不能变). 析:拿掉d个数字,还剩下n-d个数字.相当于从n个数字中按先后顺序选出n-d个数字使组成的数字最大,当然采用窗口 ...
- python将字典中的数据保存到文件中
d = {'a':'aaa','b':'bbb'}s = str(d)f = open('dict.txt','w')f.writelines(s)f.close()
- (匹配)Dolls --HDU --4160
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4160 代码: #include<stdio.h> #include<string.h& ...
- CDialog
对话框和对话框类CDialog 对话框经常被使用,因为对话框可以从模板创建,而对话框模板是可以使用资源编辑器方便地进行编辑的. 模式和无模式对话框 对话框分两种类型,模式对话框和无模式对话框. 模式对 ...
- Codeforces805 A. Fake NP 2017-05-05 08:30 327人阅读 评论(0) 收藏
A. Fake NP time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- Dwz(J-UI)框架--入门
http://www.cnblogs.com/chenyongsai/p/4933982.html Dwz(J-UI)框架--入门 一.了解 概述:是中国人自己开发的基于jQuery实现的Ajax R ...