HDU 5763 Another Meaning(FFT)
【题目链接】 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数组了。
【代码】
- #include <cstdio>
- #include <cmath>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- typedef long long LL;
- const int N=524300;
- int n,pos[N];
- namespace FFT{
- struct comp{
- double r,i;
- comp(double _r=0,double _i=0):r(_r),i(_i){}
- comp operator +(const comp&x){return comp(r+x.r,i+x.i);}
- comp operator -(const comp&x){return comp(r-x.r,i-x.i);}
- comp operator *(const comp&x){return comp(r*x.r-i*x.i,i*x.r+r*x.i);}
- comp conj(){return comp(r,-i);}
- }A[N],B[N];
- const double pi=acos(-1.0);
- void FFT(comp a[],int n,int t){
- for(int i=1;i<n;i++)if(pos[i]>i)swap(a[i],a[pos[i]]);
- for(int d=0;(1<<d)<n;d++){
- int m=1<<d,m2=m<<1;
- double o=pi*2/m2*t;
- comp _w(cos(o),sin(o));
- for(int i=0;i<n;i+=m2){
- comp w(1,0);
- for(int j=0;j<m;j++){
- comp& A=a[i+j+m],&B=a[i+j],t=w*A;
- A=B-t;B=B+t;w=w*_w;
- }
- }
- }if(t==-1)for(int i=0;i<n;i++)a[i].r/=n;
- }
- }
- const int mod=1e9+7;
- int T,Cas=1,l1,l2,ans[N],cnt=0,a[N],b[N],f[N];
- FFT::comp A[N],B[N],C[N];
- char s1[N],s2[N];
- int main(){
- scanf("%d",&T);
- while(T--){
- scanf(" %s %s",&s1,&s2);
- memset(f,0,sizeof(f));
- memset(ans,0,sizeof(ans));
- memset(a,0,sizeof(a));
- memset(b,0,sizeof(b));
- l1=strlen(s1); l2=strlen(s2);
- for(int i=0;i<l1;i++)a[i]=s1[i]-'a'+1;
- for(int i=0;i<l2;i++)b[l2-1-i]=s2[i]-'a'+1;
- int N=1; while(N<l1+l2)N<<=1;
- int j=__builtin_ctz(N)-1;
- for(int i=0;i<N;i++)C[i]=FFT::comp(0,0);
- for(int i=0;i<N;i++){pos[i]=pos[i>>1]>>1|((i&1)<<j);}
- 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);
- FFT::FFT(A,N,1);FFT::FFT(B,N,1);
- for(int i=0;i<N;i++)C[i]=C[i]+A[i]*B[i];
- 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);
- FFT::FFT(A,N,1);FFT::FFT(B,N,1);
- for(int i=0;i<N;i++)C[i]=C[i]+A[i]*B[i];
- 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);
- FFT::FFT(A,N,1);FFT::FFT(B,N,1);
- for(int i=0;i<N;i++)C[i]=C[i]-A[i]*B[i]*FFT::comp(2,0);
- FFT::FFT(C,N,-1);
- for(int i=l2-1;i<l1;i++){
- if(C[i].r<0.5)f[i]=1;
- }ans[0]=1;
- for(int i=1;i<=l1;i++){
- ans[i]=ans[i-1];
- if(f[i-1])ans[i]+=ans[i-l2];
- if(ans[i]>mod)ans[i]-=mod;
- }printf("Case #%d: %d\n",Cas++,ans[l1]);
- }return 0;
- }
HDU 5763 Another Meaning(FFT)的更多相关文章
- HDU 5763 Another Meaning (kmp + dp)
Another Meaning 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763 Description As is known to all, ...
- HDU 5763 Another Meaning(DP+KMP)
http://acm.hdu.edu.cn/showproblem.php?pid=5763 题意: 给出一个字符串和一个模式串,模式串有两种意思,问这句话有几种意思. 思路:因为肯定要去字符串去找模 ...
- 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 ...
- HDU 5763 Another Meaning
HDU 5763 Another Meaning 题意:一个字串有可能在模式串出现多次,问有多少种可能出现的情况.关键是有重合的字串是不能同时计入的. 思路:先用kmp求出所有字串的位置.然后,dp. ...
- 快速傅里叶(FFT)的快速深度思考
关于按时间抽取快速傅里叶(FFT)的快速理论深度思考 对于FFT基本理论参考维基百科或百度百科. 首先谈谈FFT的快速何来?大家都知道FFT是对DFT的改进变换而来,那么它究竟怎样改进,它改进的思想在 ...
- HDU 5938 Four Operations(四则运算)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 5775 Bubble Sort(冒泡排序)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 1711 Number Sequence(数列)
HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 1005 Number Sequence(数列)
HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
随机推荐
- QF——OC内存管理详解
堆的内存管理: 我们所说的内存管理,其实就是堆的内存管理.因为栈的内存会自动回收,堆的内存需要我们手动回收. 栈中一般存储的是基本数据类型变量和指向对象的指针(对象的引用),而真实的对象存储在堆中.因 ...
- mysql--自动增长
create table teacher( t_id int primary key auto_increment, #auto_increment 自动增长 需要整型,还需要索引 t_name va ...
- Android Material Design调色板
转: http://www.stormzhang.com/design/2014/12/26/material-design-palette/ Material Design出来一段时间了,身为And ...
- java文本编辑器5
package peng_jun; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.* ...
- Xamarin.Android 如何使用Assets目录下的文件
原文:Xamarin.Android 如何使用Assets目录下的文件 个人原创,转载注明出处:http://blog.csdn.net/supluo/article/details/43672411 ...
- Python开发技术详解(视频+源码+文档)
Python, 是一种面向对象.直译式计算机程序设计语言.Python语法简捷而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结 ...
- mac pro 设置wifi热点
系统偏好设置-共享-网络共享(Internet共享)共享来源选择你的网络(非wifi), 以下复选框选wifi,wifi设置里能够设置wifi名字password,注意不能有中文. 设置完,inter ...
- 【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 ...
- web前端学习之路
test 随着自己对于web前端知识了解的越多,越来越发现自己真的好菜 一脸茫然阶段 两年前大学接触网页设计,那时对于网页设计一窍不通,只是看了一本自己大学编的一本入门教材,我甚至不知道那些网页设计的 ...
- LDAP基础
超级好的LDAP文章: Linux下基于LDAP统一用户认证的研究 : http://chenguang.blog.51cto.com/350944/285602利用LDAP实现windows和Lin ...