Description

兔子们在玩两个串的游戏。给定两个字符串S和T,兔子们想知道T在S中出现了几次,
分别在哪些位置出现。注意T中可能有“?”字符,这个字符可以匹配任何字符。

Input

两行两个字符串,分别代表S和T

Output

第一行一个正整数k,表示T在S中出现了几次
接下来k行正整数,分别代表T每次在S中出现的开始位置。按照从小到大的顺序输出,S下标从0开始。

Sample Input

ababcadaca
a?a

Sample Output

3
0
5

HINT

S 长度不超过 10^5, T 长度不会超过 S。 S 中只包含小写字母, T中只包含小写字母和“?”

将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 两个串的更多相关文章

  1. BZOJ 4503: 两个串 [FFT]

    4503: 两个串 题意:兔子们在玩两个串的游戏.给定两个只含小写字母的字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有"?"字符,这个字符可以匹 ...

  2. 【刷题】BZOJ 4503 两个串

    Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有"?"字符,这个字符可以匹配任何字符. I ...

  3. BZOJ 4503 两个串(FFT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4503 [题目大意] 给出S串和T串,计算T在S中出现次数,T中有通配符'?'. [题解 ...

  4. BZOJ.4503.两个串(FFT/bitset)

    题目链接 \(Description\) 给定两个字符串S和T,求T在S中出现了几次,以及分别在哪些位置出现.T中可能有'?'字符,这个字符可以匹配任何字符. \(|S|,|T|\leq 10^5\) ...

  5. bzoj 4503 两个串 快速傅里叶变换FFT

    题目大意: 给定两个\((length \leq 10^5)\)的字符串,问第二个串在第一个串中出现了多少次.并且第二个串中含有单字符通配符. 题解: 首先我们从kmp的角度去考虑 这道题从字符串数据 ...

  6. bzoj 4503: 两个串【脑洞+FFT】

    真实脑洞题 因为通配符所以导致t串实际有指数级别个,任何字符串相关算法都没有用 考虑一个新的匹配方法:设a串(模板串)长为n,从m串的i位置开始匹配:\( \sum_{i=0}^{n-1}(a[j]- ...

  7. bzoj 4503 两个串——FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4503 翻转T,就变成卷积.要想想怎么判断. 因为卷积是乘积求和,又想到相等的话相减为0,所以 ...

  8. bzoj 4503 两个串 —— FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4503 推式子即可: 不知怎的调了那么久,应该是很清晰的. 代码如下: #include< ...

  9. BZOJ 4503 两个串 ——FFT

    [题目分析] 定义两个字符之间的距离为 (ai-bi)^2*ai*bi 如果能够匹配,从i到i+m的位置的和一定为0 但这和暴力没有什么区别. 发现把b字符串反过来就可以卷积用FFT了. 听说KMP+ ...

随机推荐

  1. redis部署

    下载软件 [root@localhost /]# wget http://download.redis.io/releases/redis-2.8.9.tar.gz 解压.编译.安装 [root@lo ...

  2. 我对Jenkins的认识

    参考: http://www.cnblogs.com/sunzhenchao/archive/2013/01/30/2883289.html

  3. Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)

    题目链接:http://codeforces.com/contest/522/problem/D 题目大意:  给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...

  4. Eclipse 代码显示不全的问题

    Eclipse中的"Show Source of Selected Element Only"功能引起的, 定位到: Window->Customize Perspectiv ...

  5. 利用Shodan和Censys进行信息侦查

    在渗透测试的初始阶段,Shodan.Censys等在线资源可以作为一个起点来识别目标机构的技术痕迹.本文中就以二者提供的Python API为例,举例介绍如何使用它们进行渗透测试初期的信息侦查. Sh ...

  6. iOS App更改显示的项目名

    添加Key: Bundle display name 后面value直接添加想改变的值

  7. jQuery插件写法总结以及面向对象方式写法总结

    前两个是jQuery插件,后面2个是以对象的形式开发,都类似. 写法一 (function($, window){ // 初始态定义 var _oDialogCollections = {}; // ...

  8. Caffe初试(三)使用caffe的cifar10网络模型训练自己的图片数据

    由于我涉及一个车牌识别系统的项目,计划使用深度学习库caffe对车牌字符进行识别.刚开始接触caffe,打算先将示例中的每个网络模型都拿出来用用,当然这样暴力的使用是不会有好结果的- -||| ,所以 ...

  9. hive的数据导出方式

    hive有三种导出数据的方式 >导出数据到本地 >导出数据到hdfs >导出数据到另一个表   导出数据到本地文件系统 insert overwrite local director ...

  10. UltraEdit 注册机使用说明

    请断开网络连接(或直接拔掉网线)后执行: 安装完成后,点击弹出界面的“注册”按钮,然后直接点击“激活”,此时UltraEdit检测到网络断开则弹出界面提示“脱机激活”,此时启动注册机,并将UltraE ...