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采集工具curl快速入门教程
为什么要用CURL? CURL(Client URL Library Functions)是一个利用URL语法在命令行方式下工作的文件传输工具.它支持很多协议:FTP, FTPS, HTTP, HTT ...
- 一个asp采集程序
<% if request.QueryString="" then url="http://www.hbcz.gov.cn:7001/XZQHQueryWAR/xx ...
- c# 通过反射调用类的构造函数
var constructors=typeof(Demo).GetConstructors(); var paramsInfos=constructors[i].GetParameters();//I ...
- ps批量处理图片
刚刚有朋友问,ps咋做批量动作呢,其实特别简单,基本一劳永逸,用尺寸做个例子,大家看看就知道了.
- r-cnn学习(四):train_faster_rcnn_alt_opt.py源码学习
论文看的云里雾里,希望通过阅读其代码来进一步了解. 参考:http://blog.csdn.net/sloanqin/article/details/51525692 首先是./tools/train ...
- Rails 实现多对多自连接
1. 先生成关联代码 class WorkConnect < ActiveRecord::Base belongs_to :working, class_name: "Company& ...
- python之路四
内建函数 内建函数详解: 1. abs(x) abs()函数返回数字(可为普通型.长整型或浮点型)的绝对值.如果给出复数,返回值就是该复数的模.例如: >>>print abs(-2 ...
- C++库(Google Breakpad)
Google Breakpad是什么? 一个开源的多平台崩溃报告系统. Google breakpad是一个非常实用的跨平台的崩溃转储和分析模块,它支持Windows,Linux和Mac和Solari ...
- [Sass]命令编译
[Sass]命令编译 命令编译是指使用你电脑中的命令终端,通过输入 Sass 指令来编译 Sass.这种编译方式是最直接也是最简单的一种方式.因为只需要在你的命令终端输入: 单文件编译: sass & ...
- APP测试实用小工具
1.ADB万能驱动 http://pan.baidu.com/s/1jIJPwhS 2.安卓手机屏幕共享 http://pan.baidu.com/s/1nv6ma1b 3.IOS手机屏幕共享 htt ...