【题目分析】

定义两个字符之间的距离为

(ai-bi)^2*ai*bi

如果能够匹配,从i到i+m的位置的和一定为0

但这和暴力没有什么区别。

发现把b字符串反过来就可以卷积用FFT了。

听说KMP+暴力可以卡到100ms以内(雾)

【代码】

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. #define maxn 400005
  9. #define F(i,j,k) for (int i=j;i<=k;++i)
  10. #define D(i,j,k) for (int i=j;i>=k;--i)
  11.  
  12. const double pi=acos(-1.0);
  13. const double eps=1e-6;
  14.  
  15. struct Complex{
  16. double x,y;
  17. Complex operator + (Complex a) const{Complex b; return b.x=x+a.x,b.y=y+a.y,b;}
  18. Complex operator - (Complex a) const{Complex b; return b.x=x-a.x,b.y=y-a.y,b;}
  19. Complex operator * (Complex a) const{Complex b; return b.x=x*a.x-y*a.y,b.y=x*a.y+y*a.x,b;}
  20. }a[maxn],b[maxn],c[maxn];
  21.  
  22. char s[maxn],t[maxn];
  23. int A[maxn],B[maxn];
  24. int ls,lt,rev[maxn],n,m=1,len,ans[maxn];
  25.  
  26. void FFT(Complex * x, int n, int f)
  27. {
  28. F(i,0,n-1) if (rev[i]>i) swap(x[rev[i]],x[i]);
  29. for (int m=2;m<=n;m<<=1)
  30. {
  31. int mid=m>>1;Complex wn; wn.x=cos(2.0*pi/m*f); wn.y=sin(2.0*pi/m*f);
  32. for (int i=0;i<n;i+=m)
  33. {
  34. Complex w; w.x=1.0; w.y=0;
  35. F(j,0,mid-1)
  36. {
  37. Complex a=x[i+j],b=x[i+j+mid]*w;
  38. x[i+j]=a+b; x[i+j+mid]=a-b;
  39. w=w*wn;
  40. }
  41. }
  42. }
  43. }
  44.  
  45. int main()
  46. {
  47. // freopen("in.txt","r",stdin);
  48. scanf("%s",s); scanf("%s",t);
  49. ls=strlen(s); lt=strlen(t);
  50. n=ls+lt+1;
  51. while (m<=n) m<<=1,len++; n=m;
  52. F(i,0,n-1)
  53. {
  54. int t=i,ret=0;
  55. F(j,1,len) ret<<=1,ret|=t&1,t>>=1;
  56. rev[i]=ret;
  57. }
  58. F(i,0,ls-1) A[i]=s[i]-'a'+1;
  59. F(i,0,lt-1) {B[lt-i-1]=t[i]-'a'+1;if (t[i]=='?') B[lt-i-1]=0;}
  60.  
  61. memset(a,0,sizeof a);
  62. memset(b,0,sizeof b);
  63. F(i,0,n-1) a[i].x=1;
  64. F(i,0,n-1) b[i].x=B[i]*B[i]*B[i];
  65. FFT(a,n,1); FFT(b,n,1);
  66. F(i,0,n-1)
  67. c[i]=a[i]*b[i];
  68.  
  69. memset(a,0,sizeof a);
  70. memset(b,0,sizeof b);
  71. F(i,0,n-1) a[i].x=2*A[i];
  72. F(i,0,n-1) b[i].x=B[i]*B[i];
  73. FFT(a,n,1); FFT(b,n,1);
  74. F(i,0,n-1)
  75. c[i]=c[i]-a[i]*b[i];
  76.  
  77. memset(a,0,sizeof a);
  78. memset(b,0,sizeof b);
  79. F(i,0,n-1) a[i].x=A[i]*A[i];
  80. F(i,0,n-1) b[i].x=B[i];
  81. FFT(a,n,1); FFT(b,n,1);
  82. F(i,0,n-1) c[i]=c[i]+a[i]*b[i];
  83.  
  84. FFT(c,n,-1);
  85. F(i,0,n-1) c[i].x=c[i].x/n;
  86. int cnt=0;
  87. F(i,0,ls-lt) if (c[i+lt-1].x<0.5) cnt++;
  88. printf("%d\n",cnt);
  89. F(i,0,ls-lt) if (c[i+lt-1].x<0.5) printf("%d\n",i);
  90. }

  

BZOJ 4503 两个串 ——FFT的更多相关文章

  1. BZOJ 4503: 两个串 [FFT]

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

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

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

  3. bzoj 4503 两个串——FFT

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

  4. bzoj 4503 两个串 —— FFT

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

  5. bzoj 4503 两个串

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

  6. 【刷题】BZOJ 4503 两个串

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

  7. BZOJ 4503 两个串(FFT)

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

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

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

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

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

随机推荐

  1. 解决在安装Fiddler4.6版本后,在手机上安装证书出现的问题解决方法

    解决在安装Fiddler4.6版本后,在手机上安装证书出现的问题解决方法 设置fiddler抓手机包后,在手机上访问http://ip:port,出现如下问题: 问题:creation of the ...

  2. IOS修改系统音量

    #import <IOKit/IOKitLib.h> #import <IOKit/hidsystem/IOHIDLib.h> #import <IOKit/hidsys ...

  3. C++数据文件存储与加载(利用opencv)

    首先请先确认已经安装好了opencv3及以上版本. #include <opencv2/opencv.hpp>#include <iostream>#include <s ...

  4. HTML5微信播放全屏问题的解决方法

    在ios和安卓手机里的微信下播放视频时,会遇到不少问题,例如需要手动点击,视频才会播放,并且视频会跳出微信框,出现控制条,如果视频不是腾讯视频,播放完毕会出现腾讯视频的广告推送等问题 解决办法:给vi ...

  5. Java习题附答案

    第一章练习题(Java入门) 1.下列哪项不是JDK所包含的内容?(选一项)C 红色代表正确答案 A.Java编程语言 B.工具及工具的API C.Java EE扩展API D.Java平台虚拟机 2 ...

  6. javaEE(9)_在线支付

    一.目前主要的两种支付方案 二.支付流程 1.用户在提交订单完成选择易宝支付按钮后,会跳转到如下页面选择要支付的银行,如下所示: <!DOCTYPE HTML PUBLIC "-//W ...

  7. java在线聊天项目1.1版 ——开启多个客户端,分别实现注册和登录功能,使用客户端与服务端信息request机制,重构线程,将单独的登录和注册线程合并

    实现效果图: eclipse项目中初步整合之前的各个客户端和服务端的窗口与工具类,效果如下图: 已将注册服务器线程RegServer功能放到LoginServer中,使用客户端与服务端的request ...

  8. ios之UIPickView

    以下为控制器代码,主要用到的是UIPickerView 主要步骤:新建一个Single View Application 然后,如上图所示,拖进去一个UILabel Title设置为导航,再拖进去一个 ...

  9. json 将key值以字符串形式取出

    int GetJsonCString(const Json::Value& value, char* str, int n){ if (!value.empty() && va ...

  10. ZJOI2018游记Round2

    Day0 趁着空档还溜回班上了一节物理课:瓢泼之中在9:00赶往余姚,车程3h+-- 中饭在一家饭馆,味道海星. 晚上和ykh,chj,xzt溜去吃一鸣和烧烤.一鸣不错,烧烤的话我因为口腔溃疡没怎么吃 ...