bzoj 4503 两个串
Description
Input
Output
Sample Input
a?a
Sample Output
0
5
HINT
将b串反转
设两个串的距离值为∑(ai-aj)2aiaj=∑ai3aj+∑aiaj3-∑2ai2aj2
当为*时ai为0
FFT直接上
#include<bits/stdc++.h>
#define pi acos(-1)
#define maxn 300010
using namespace std;
struct Complex{
double r,i;
Complex(double x=,double y=){r=x,i=y;}
Complex operator + (Complex x){return Complex(r+x.r,i+x.i);}
Complex operator - (Complex x){return Complex(r-x.r,i-x.i);}
Complex operator * (Complex x){return Complex(r*x.r-i*x.i,r*x.i+i*x.r);}
}A[maxn],B[maxn],C[maxn];
char a[maxn],b[maxn];
int rev[maxn];
int N,L;
int k1[maxn],k2[maxn];
int l1,l2;
int ans;
int k[maxn];
void FFT(Complex a[],int n,int f){
for(int i=;i<n;++i)
if(i<rev[i])
swap(a[i],a[rev[i]]);
for(int i=;i<=n;i<<=){
Complex wn=Complex(cos(*pi/i),sin(*pi/i)*f);
for(int j=;j<n;j+=i){
Complex w=Complex(,);
for(int k=;k<(i>>);++k,w=w*wn){
Complex tmp1=a[j+k],tmp2=a[j+k+(i>>)]*w;
a[j+k]=tmp1+tmp2;a[j+k+(i>>)]=tmp1-tmp2;
}
}
}
if(f==-)for(int i=;i<n;++i)a[i].r/=n;
}
void init(){
scanf("%s%s",a,b);
l1=strlen(a);l2=strlen(b);
for(int i=;i<l1;++i)k1[i]=a[i]-'a'+;
for(int i=;i<(l2>>);++i)swap(b[i],b[l2-i-]);
for(int i=;i<l2;++i)
if(b[i]=='?')k2[i]=;
else k2[i]=b[i]-'a'+;
N=,L=;while(N<l1+l2)N<<=,L++;
for(int i=;i<N;++i)rev[i]=(rev[i>>]>>)|((i&)<<(L-));
}
void work(){
for(int i=;i<N;++i)A[i]=Complex(k1[i],);
for(int i=;i<N;++i)B[i]=Complex(k2[i]*k2[i]*k2[i],);
FFT(A,N,);FFT(B,N,);
for(int i=;i<N;++i)C[i]=C[i]+(A[i]*B[i]);
for(int i=;i<N;++i)A[i]=Complex(k1[i]*k1[i]*k1[i],);
for(int i=;i<N;++i)B[i]=Complex(k2[i],);
FFT(A,N,);FFT(B,N,);
for(int i=;i<N;++i)C[i]=C[i]+(A[i]*B[i]);
for(int i=;i<N;++i)A[i]=Complex(k1[i]*k1[i]*,);
for(int i=;i<N;++i)B[i]=Complex(k2[i]*k2[i],);
FFT(A,N,);FFT(B,N,);
for(int i=;i<N;++i)C[i]=(C[i]-(A[i]*B[i]));
FFT(C,N,-);
for(int i=l2-;i<l1;++i)
if(C[i].r<0.5)k[++ans]=i-l2+;
printf("%d\n",ans);
for(int i=;i<=ans;++i)
printf("%d\n",k[i]);
}
int main(){
init();
work();
return ;
}
bzoj 4503 两个串的更多相关文章
- BZOJ 4503: 两个串 [FFT]
4503: 两个串 题意:兔子们在玩两个串的游戏.给定两个只含小写字母的字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有"?"字符,这个字符可以匹 ...
- 【刷题】BZOJ 4503 两个串
Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有"?"字符,这个字符可以匹配任何字符. I ...
- BZOJ 4503 两个串(FFT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4503 [题目大意] 给出S串和T串,计算T在S中出现次数,T中有通配符'?'. [题解 ...
- BZOJ.4503.两个串(FFT/bitset)
题目链接 \(Description\) 给定两个字符串S和T,求T在S中出现了几次,以及分别在哪些位置出现.T中可能有'?'字符,这个字符可以匹配任何字符. \(|S|,|T|\leq 10^5\) ...
- bzoj 4503 两个串 快速傅里叶变换FFT
题目大意: 给定两个\((length \leq 10^5)\)的字符串,问第二个串在第一个串中出现了多少次.并且第二个串中含有单字符通配符. 题解: 首先我们从kmp的角度去考虑 这道题从字符串数据 ...
- bzoj 4503: 两个串【脑洞+FFT】
真实脑洞题 因为通配符所以导致t串实际有指数级别个,任何字符串相关算法都没有用 考虑一个新的匹配方法:设a串(模板串)长为n,从m串的i位置开始匹配:\( \sum_{i=0}^{n-1}(a[j]- ...
- bzoj 4503 两个串——FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4503 翻转T,就变成卷积.要想想怎么判断. 因为卷积是乘积求和,又想到相等的话相减为0,所以 ...
- bzoj 4503 两个串 —— FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4503 推式子即可: 不知怎的调了那么久,应该是很清晰的. 代码如下: #include< ...
- BZOJ 4503 两个串 ——FFT
[题目分析] 定义两个字符之间的距离为 (ai-bi)^2*ai*bi 如果能够匹配,从i到i+m的位置的和一定为0 但这和暴力没有什么区别. 发现把b字符串反过来就可以卷积用FFT了. 听说KMP+ ...
随机推荐
- PHP文件包含漏洞攻防实战(allow_url_fopen、open_basedir)
摘要 PHP是一种非常流行的Web开发语言,互联网上的许多Web应用都是利用PHP开发的.而在利用PHP开发的Web应用中,PHP文件包含漏洞是一种常见的漏洞.利用PHP文件包含漏洞入侵网站也是主流的 ...
- MySQL索引的Index method中btree和hash的优缺点
MySQL索引的Index method中btree和hash的区别 在MySQL中,大多数索引(如 PRIMARY KEY,UNIQUE,INDEX和FULLTEXT)都是在BTREE中存储,但使用 ...
- 基于jquery fly插件实现加入购物车抛物线动画效果,jquery.fly.js
在购物网站中,加入购物车的功能是必须的功能,有的网站在用户点击加入购物车按钮时,就会出现该商品从点击出以抛物线的动画相似加入购物车,这个功能看起来非常炫,对用户体验也有一定的提高.下面介绍基于jque ...
- word20161211
H.323 half-duplex / 半双工 handle count / 句柄数 handshaking / 握手 Hardware Compatibility List, HCL / 硬件兼容性 ...
- 字符串专题:KMP POJ 3561
http://poj.org/problem?id=3461 KMP这里讲的不错next的求法值得借鉴 http://blog.sina.com.cn/s/blog_70bab9230101g0qv. ...
- BZOJ 4576: [Usaco2016 Open]262144
Description 一个序列,每次可以将两个相同的数合成一个数,价值+1,求最后最大价值 \(n \leqslant 262144\) Sol DP. 这道题是 BZOJ 4580: [Usaco ...
- javax.validation.ConstraintViolationException---Hibernate后台实体校验
javax.validation.ConstraintViolationException ... 71 moreCaused by: javax.validation.ConstraintViola ...
- 使用EmBitz开发STM32项目的环境配置
一.EmBitz软件获取与安装 1.EmBitz软件的获取 EmBitz原名Em::Blocks,是基于Code::Blocks开发的,面向嵌入式的C/C++集成开发环境.支持J-Link和ST-Li ...
- 同步异步,阻塞非阻塞 和nginx的IO模型
同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication).所谓同步,就是在发出一个*调用*时,在没有得 ...
- iOS Waxpatch项目(动态更新)
我的iOS Waxpatch项目地址https://github.com/piaojin/iOS-WaxPatch