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. 【Go入门教程7】并发(goroutine,channels,Buffered Channels,Range和Close,Select,超时,runtime goroutine)

    有人把Go比作21世纪的C语言,第一是因为Go语言设计简单,第二,21世纪最重要的就是并行程序设计,而Go从语言层面就支持了并行. goroutine goroutine是Go并行设计的核心.goro ...

  2. js简单弹出层、遮罩层

    <html> <head> <title>js简单弹出层</title> <style> /*阴影边框效果*/ .box-shadow-1 ...

  3. Qt:postEvent 与 customEvent() 函数 进行异步通信; 以及参数的传递 // 防止界面卡死;;

    class ColorChangeEvent : public QCustomEvent { public: ColorChangeEvent( QColor color ) : QCustomEve ...

  4. 【数据采集】VBA数据采集可用 COM 组件

    windows 中提供了4个COM组件都可以进行数据采集. Wininet WinHttp XmlHttp MSHTML https://msdn.microsoft.com/en-us/librar ...

  5. 根据字符长度动态确定UIlabel宽高

    iOS7中用以下方法 - (CGSize)sizeWithAttributes:(NSDictionary *)attrs; 替代过时的iOS6中的- (CGSize)sizeWithFont:(UI ...

  6. iOS离屏渲染简书

    更详细地址https://zsisme.gitbooks.io/ios-/content/chapter15/offscreen-rendering.html(包含了核心动画) GPU渲染机制: CP ...

  7. ajax表单提交

    HTML代码: <form id="formCity" action="/SiteMap/Search" method="get" o ...

  8. 【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

    一.闪回 1.可能的误操作 (1)错误的删除了记录 (2)错误的删除了表 (3)查询历史记录 (4)撤销已经提交了的事务. 2.对应着以上四种类型的误操作,有四种闪回类型 (1)闪回表:将表回退到过去 ...

  9. k-means聚类算法python实现

    K-means聚类算法 算法优缺点: 优点:容易实现缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢使用数据类型:数值型数据 算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他 ...

  10. Oracle在存储过程中如何返回结果集

    Oracle和Sqlserver不一样的地方有很多. 个人最深的体会是存储过程返回结果集,在Sqlserver中直接select查询就行,Oracle就不行了. 这里,就用最简单的例子说明存储过程返回 ...