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. PHP函数 addslashes() 和 mysql_real_escape_string() 的区别 && SQL宽字节,绕过单引号注入攻击

    首先:不要使用 mysql_escape_string(),它已被弃用,请使用 mysql_real_escape_string() 代替它. mysql_real_escape_string() 和 ...

  2. 06OC之内存管理

    在高级语言中,例如C#是通过垃圾回收机制(GC)来解决这个问题,但是在OC并没有类似的垃圾回收机制,因此必须由程序员手动去维护.今天就讲讲OC中的内存管理: 一.内存管理原理 在Xcode4.2之后的 ...

  3. 【Android自学日记】搭建Android开发环境

    搭建Android应用开发环境所需工具 1_> JDK(JAVA Development)推荐使用6.0以后版本 配置环境变量(以下是环境变量的具体内容及介绍) ================ ...

  4. Android studio 显示代码行号 设置

    首先我们打开我们的Android Studio.   这时会弹出setting页面,我们选择show line numbers然后点击确定按钮.   此时我们就可以看到代码左侧显示出行号了   我们可 ...

  5. 一、CoreAnimation之图层树详解

    CoreAnimation :在字面意思为“核心动画”,但是如果您认为它仅仅是一个动画框架,那可能就要错过一些经典功能了.动画,只是CoreAnimation功能的一小部分,毕竟人家的源头是一个叫做L ...

  6. Mac eclipse 导入文件夹

    貌似发现了个bug: Eclipse IDE for C/C++ Developers Version: Mars.1 Release (4.5.1)Build id: 20150924-1200 M ...

  7. 如何使用Android JetPlayer类

    在Android中,还提供了对Jet播放的支持,Jet是由OHA联盟成员SONiVOX开发的一个交互音乐引擎.其包括两部分:JET播放器和JET引擎.JET常用于控制游戏的声音特效,采用MIDI(Mu ...

  8. mysql数据库链接与创建

    有童鞋问到说,环境搭建好了,mysql也安装了,但是就是进不去数据库,也启动不了,一直报错,那么下面这边就说下如何用Navicat链接上创建的数据库 首先 1)在xshell里进入mysql,命令是: ...

  9. js 一些容易错的点

    最近在做平台相关功能,需要和js.html.以及使用bootstrap,bootstrap元素大小的设置 是比较难的. js比较容易出错的是,解析json,对象最好是使用json,这样更好解析,arr ...

  10. NOI 2010 海拔 ——平面图转对偶图

    [题目分析] 可以知道,所有的海拔是0或1 最小割转最短路,就可以啦 SPFA被卡,只能换DIJ [代码] #include <cstdio> #include <cstring&g ...