【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5763

【题目大意】

  给出两个串S和T,可以将S串中出现的T替换为*,问S串有几种表达方式。

【题解】

  我们定义数组f为S串中T出现的最后一个字母所在的位置,那么ans[i]=ans[i-1]+f[i-1]?ans[i-lenT]:0,一遍递推即可,所以关键就在于求出f数组了,f数组可以用kmp求,由于最近练FFT,用FFT求距离卷积匹配为0的位置,就是f数组了。

【代码】

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include <cstring>
  5. using namespace std;
  6. typedef long long LL;
  7. const int N=524300;
  8. int n,pos[N];
  9. namespace FFT{
  10. struct comp{
  11. double r,i;
  12. comp(double _r=0,double _i=0):r(_r),i(_i){}
  13. comp operator +(const comp&x){return comp(r+x.r,i+x.i);}
  14. comp operator -(const comp&x){return comp(r-x.r,i-x.i);}
  15. comp operator *(const comp&x){return comp(r*x.r-i*x.i,i*x.r+r*x.i);}
  16. comp conj(){return comp(r,-i);}
  17. }A[N],B[N];
  18. const double pi=acos(-1.0);
  19. void FFT(comp a[],int n,int t){
  20. for(int i=1;i<n;i++)if(pos[i]>i)swap(a[i],a[pos[i]]);
  21. for(int d=0;(1<<d)<n;d++){
  22. int m=1<<d,m2=m<<1;
  23. double o=pi*2/m2*t;
  24. comp _w(cos(o),sin(o));
  25. for(int i=0;i<n;i+=m2){
  26. comp w(1,0);
  27. for(int j=0;j<m;j++){
  28. comp& A=a[i+j+m],&B=a[i+j],t=w*A;
  29. A=B-t;B=B+t;w=w*_w;
  30. }
  31. }
  32. }if(t==-1)for(int i=0;i<n;i++)a[i].r/=n;
  33. }
  34. }
  35. const int mod=1e9+7;
  36. int T,Cas=1,l1,l2,ans[N],cnt=0,a[N],b[N],f[N];
  37. FFT::comp A[N],B[N],C[N];
  38. char s1[N],s2[N];
  39. int main(){
  40. scanf("%d",&T);
  41. while(T--){
  42. scanf(" %s %s",&s1,&s2);
  43. memset(f,0,sizeof(f));
  44. memset(ans,0,sizeof(ans));
  45. memset(a,0,sizeof(a));
  46. memset(b,0,sizeof(b));
  47. l1=strlen(s1); l2=strlen(s2);
  48. for(int i=0;i<l1;i++)a[i]=s1[i]-'a'+1;
  49. for(int i=0;i<l2;i++)b[l2-1-i]=s2[i]-'a'+1;
  50. int N=1; while(N<l1+l2)N<<=1;
  51. int j=__builtin_ctz(N)-1;
  52. for(int i=0;i<N;i++)C[i]=FFT::comp(0,0);
  53. for(int i=0;i<N;i++){pos[i]=pos[i>>1]>>1|((i&1)<<j);}
  54. for(int i=0;i<N;i++)A[i]=FFT::comp(a[i]*a[i]*a[i],0),B[i]=FFT::comp(b[i],0);
  55. FFT::FFT(A,N,1);FFT::FFT(B,N,1);
  56. for(int i=0;i<N;i++)C[i]=C[i]+A[i]*B[i];
  57. for(int i=0;i<N;i++)A[i]=FFT::comp(a[i],0),B[i]=FFT::comp(b[i]*b[i]*b[i],0);
  58. FFT::FFT(A,N,1);FFT::FFT(B,N,1);
  59. for(int i=0;i<N;i++)C[i]=C[i]+A[i]*B[i];
  60. for(int i=0;i<N;i++)A[i]=FFT::comp(a[i]*a[i],0),B[i]=FFT::comp(b[i]*b[i],0);
  61. FFT::FFT(A,N,1);FFT::FFT(B,N,1);
  62. for(int i=0;i<N;i++)C[i]=C[i]-A[i]*B[i]*FFT::comp(2,0);
  63. FFT::FFT(C,N,-1);
  64. for(int i=l2-1;i<l1;i++){
  65. if(C[i].r<0.5)f[i]=1;
  66. }ans[0]=1;
  67. for(int i=1;i<=l1;i++){
  68. ans[i]=ans[i-1];
  69. if(f[i-1])ans[i]+=ans[i-l2];
  70. if(ans[i]>mod)ans[i]-=mod;
  71. }printf("Case #%d: %d\n",Cas++,ans[l1]);
  72. }return 0;
  73. }

  

HDU 5763 Another Meaning(FFT)的更多相关文章

  1. HDU 5763 Another Meaning (kmp + dp)

    Another Meaning 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763 Description As is known to all, ...

  2. HDU 5763 Another Meaning(DP+KMP)

    http://acm.hdu.edu.cn/showproblem.php?pid=5763 题意: 给出一个字符串和一个模式串,模式串有两种意思,问这句话有几种意思. 思路:因为肯定要去字符串去找模 ...

  3. A * B Problem Plus HDU - 1402 (FFT)

    A * B Problem Plus HDU - 1402 (FFT) Calculate A * B.  InputEach line will contain two integers A and ...

  4. HDU 5763 Another Meaning

    HDU 5763 Another Meaning 题意:一个字串有可能在模式串出现多次,问有多少种可能出现的情况.关键是有重合的字串是不能同时计入的. 思路:先用kmp求出所有字串的位置.然后,dp. ...

  5. 快速傅里叶(FFT)的快速深度思考

    关于按时间抽取快速傅里叶(FFT)的快速理论深度思考 对于FFT基本理论参考维基百科或百度百科. 首先谈谈FFT的快速何来?大家都知道FFT是对DFT的改进变换而来,那么它究竟怎样改进,它改进的思想在 ...

  6. HDU 5938 Four Operations(四则运算)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  7. HDU 5775 Bubble Sort(冒泡排序)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  8. HDU 1711 Number Sequence(数列)

    HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  9. HDU 1005 Number Sequence(数列)

    HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...

随机推荐

  1. QF——OC内存管理详解

    堆的内存管理: 我们所说的内存管理,其实就是堆的内存管理.因为栈的内存会自动回收,堆的内存需要我们手动回收. 栈中一般存储的是基本数据类型变量和指向对象的指针(对象的引用),而真实的对象存储在堆中.因 ...

  2. mysql--自动增长

    create table teacher( t_id int primary key auto_increment, #auto_increment 自动增长 需要整型,还需要索引 t_name va ...

  3. Android Material Design调色板

    转: http://www.stormzhang.com/design/2014/12/26/material-design-palette/ Material Design出来一段时间了,身为And ...

  4. java文本编辑器5

    package peng_jun; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.* ...

  5. Xamarin.Android 如何使用Assets目录下的文件

    原文:Xamarin.Android 如何使用Assets目录下的文件 个人原创,转载注明出处:http://blog.csdn.net/supluo/article/details/43672411 ...

  6. Python开发技术详解(视频+源码+文档)

    Python, 是一种面向对象.直译式计算机程序设计语言.Python语法简捷而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结 ...

  7. mac pro 设置wifi热点

    系统偏好设置-共享-网络共享(Internet共享)共享来源选择你的网络(非wifi), 以下复选框选wifi,wifi设置里能够设置wifi名字password,注意不能有中文. 设置完,inter ...

  8. 【DateStructure】 Charnming usages of Map collection in Java

    When learning the usage of map collection in java, I found serveral beneficial methods that was enco ...

  9. web前端学习之路

    test 随着自己对于web前端知识了解的越多,越来越发现自己真的好菜 一脸茫然阶段 两年前大学接触网页设计,那时对于网页设计一窍不通,只是看了一本自己大学编的一本入门教材,我甚至不知道那些网页设计的 ...

  10. LDAP基础

    超级好的LDAP文章: Linux下基于LDAP统一用户认证的研究 : http://chenguang.blog.51cto.com/350944/285602利用LDAP实现windows和Lin ...