fft

搞一个生成函数

对于每位A(j)=Σi=1->m (a[i]-b[i+j])^2*a[i]*b[i+j]

如果A(j)=0说明这位匹配

如果这位是*那么a[i]=0否则等于字母-'a'+1,b也是这样构造

然后我们翻转a串就可以加速了

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define pi acos(-1)
  4. const int N = ( << ) + ;
  5. int n = , n1, n2, k;
  6. char s1[N], s2[N];
  7. int t[N], ans[N];
  8. struct data {
  9. double a, b;
  10. data() { a = ; b = ; }
  11. data(double _, double __) : a(_), b(__) {}
  12. data friend operator + (const data &a, const data &b) { return data(a.a + b.a, a.b + b.b); }
  13. data friend operator - (const data &a, const data &b) { return data(a.a - b.a, a.b - b.b); }
  14. data friend operator * (const data &a, const data &b) { return data(a.a * b.a - a.b * b.b, a.a * b.b + a.b * b.a); }
  15. } a0[N], b0[N], a1[N], b1[N], a2[N], b2[N];
  16. void fft(data *a, int f)
  17. {
  18. for(int i = ; i < n; ++i)
  19. {
  20. int t = ;
  21. for(int j = ; j < k; ++j) if(i >> j & ) t |= << (k - j - );
  22. if(i < t) swap(a[i], a[t]);
  23. }
  24. for(int l = ; l <= n; l <<= )
  25. {
  26. int m = l >> ;
  27. data w = data(cos(pi / m), f * sin(pi / m));
  28. for(int i = ; i < n; i += l)
  29. {
  30. data t = data(, );
  31. for(int k = ; k < m; ++k, t = t * w)
  32. {
  33. data x = a[i + k], y = t * a[i + k + m];
  34. a[i + k] = x + y;
  35. a[i + k + m] = x - y;
  36. }
  37. }
  38. }
  39. }
  40. int main()
  41. {
  42. scanf("%d%d%s%s", &n1, &n2, s1, s2);
  43. reverse(s1, s1 + n1);
  44. --n1;
  45. --n2;
  46. for(int i = ; i <= n1; ++i) if(s1[i] != '*')
  47. {
  48. double x = s1[i] - 'a' + ;
  49. a0[i] = data(x, );
  50. a1[i] = data(x * x, );
  51. a2[i] = data(x * x * x, );
  52. }
  53. for(int i = ; i <= n2; ++i) if(s2[i] != '*')
  54. {
  55. double x = s2[i] - 'a' + ;
  56. b0[i] = data(x, );
  57. b1[i] = data(- * x * x, );
  58. b2[i] = data(x * x * x, );
  59. }
  60. while(n <= n1 + n2) n <<= , ++k;
  61. fft(a0, );
  62. fft(a1, );
  63. fft(a2, );
  64. fft(b0, );
  65. fft(b1, );
  66. fft(b2, );
  67. for(int i = ; i < n; ++i) a2[i] = a2[i] * b0[i], a1[i] = a1[i] * b1[i], a0[i] = a0[i] * b2[i], a2[i] = a2[i] + a1[i] + a0[i];
  68. fft(a2, -);
  69. for(int i = ; i < n; ++i) t[i] = (int)(a2[i].a / n + 0.1);
  70. for(int i = ; i <= n2 - n1; ++i) if(t[i + n1] == ) ans[++ans[]] = i + ;
  71. printf("%d\n", ans[]);
  72. for(int i = ; i < ans[]; ++i) printf("%d ", ans[i]);
  73. printf("%d\n", ans[ans[]]);
  74. return ;
  75. }

bzoj4259的更多相关文章

  1. BZOJ4259 残缺的字符串 多项式 FFT

    原文链接http://www.cnblogs.com/zhouzhendong/p/8798532.html 题目传送门 - BZOJ4259 题意 给你两个串,用其中一个来匹配另一个.问从母串的那些 ...

  2. 【BZOJ4259】残缺的字符串

    [BZOJ4259]残缺的字符串 Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时, ...

  3. BZOJ4259 残缺的字符串(FFT)

    两个串匹配时相匹配的位置位置差是相同的,那么翻转一个串就变成位置和相同,卷积的形式. 考虑如何使用卷积体现两个位置能否匹配.一个暴力的思路是每次只考虑一种字符,将其在一个串中设为1,并在另一个串中将不 ...

  4. 【BZOJ4259】残缺的字符串(FFT)

    [BZOJ4259]残缺的字符串(FFT) 题面 给定两个字符串\(|S|,|T|\),两个字符串中都带有通配符. 回答\(T\)在\(S\)中出现的次数. \(|T|,|S|<=300000\ ...

  5. 【BZOJ4259】残缺的字符串 FFT

    [BZOJ4259]残缺的字符串 Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时, ...

  6. 【bzoj4259/bzoj4503】残缺的字符串/两个串 FFT

    bzoj4259 题目描述 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有 ...

  7. BZOJ4259: 残缺的字符串 & BZOJ4503: 两个串

    [传送门:BZOJ4259&BZOJ4503] 简要题意: 给出两个字符串,第一个串长度为m,第二个串长度为n,字符串中如果有*字符,则代表当前位置可以匹配任何字符 求出第一个字符串在第二个字 ...

  8. BZOJ4259残缺的字符串

    题目描述 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有不同程度的残缺. ...

  9. [BZOJ4259]残缺的字符串

    Description: 给定两个带通配符的串,求可能出现几次匹配,以及这些匹配位置 Hint: \(n \le 3*10^5\) Solution: 定义匹配函数 \(P(x)=\sum_{i=x} ...

  10. BZOJ4259: 残缺的字符串(FFT 字符串匹配)

    题意 题目链接 Sol 知道FFT能做字符串匹配的话这就是个裸题了吧.. 考虑把B翻转过来,如果\(\sum_{k = 0}^M (B_{i - k} - A_k)^2 * B_{i-k}*A_k = ...

随机推荐

  1. 云舒网络译:Rancher1.0正式版公布

    编者注: Rancher Labs是一家容器技术基础设施提供商,总部位于美国硅谷,Rancher是一个高效易用的企业容器云平台. 云舒网络 http://www.cloudsoar.com/为Ranc ...

  2. Hadoop 50090端口的页面, Replication的数字是真实的文件备份数吗? (不是)

    红色方框的部分,代表Hadoop系统,人工设定的文件备份数,但不是实际的备份数.文件备份数 不会大于集群机器的总数目(因为备份文件不会同时存在一台机器上,这样就没有意义),所以如果总集群数目是2,即使 ...

  3. FPGA机器学习之机器学习的n中算法总结1

    机器学习是AI领域的重要一门学科.前面我描写叙述过.我计划从事的方向是视觉相关的机器学习分类识别,所以可能在每一个算法的分析中,仅仅增加在视频.视觉领域的作用. 我毛华望QQ849886241.技术博 ...

  4. php源码zend_do_begin_namespace函数详解

    version:5.6.21 file:Zend/zend_compile.c line:7055-7152 void zend_do_begin_namespace(const znode *nam ...

  5. checkAll全选的一个小例子

    function checkAll(tag,flag) { //得到所有check var checkboxs = $(tag).closest("table").find(&qu ...

  6. Xcode 6 IDE

    本文转载至 http://www.cocoachina.com/ios/20140823/9442.html     (via:苹果开发者中心) Xcode IDE 是 Apple 开发体验的核心.X ...

  7. (转) 实现wince datagrid 上下滑屏数据浏览

    开发 基于wince 手持设备数据库应用时 由于是触摸屏 当datagrid 数据过多 往往用户烦于去控制又窄又细的上下滚动条 尤其是高分辨率的屏上 (如魅族M8系统 720×480) 而且datag ...

  8. Package template (html/template) ... Types HTML, JS, URL, and others from content.go can carry safe content that is exempted from escaping. ... (*Template) Funcs ..

    https://godoc.org/text/template GoDoc Home About Go: text/templateIndex | Examples | Files | Directo ...

  9. kong

    https://docs.konghq.com/install/centos/ wget https://bintray.com/kong/kong-community-edition-rpm/dow ...

  10. DuiLib笔记之设置文本字体

    设置文本字体要用到Font 它的常用属性如下 id 用于标识Font,类型:INT name 用于指定字体名称,类型:STRING size 用于指定字体大小,类型:INT bold 用于指定是否加粗 ...