我又变成sb了

首先通过%可以得到一个这样的柿子:

设s1是模版串,s2是匹配串,j表示模版串以j为起始的子串

fj(0<j<=s1len-s2len) =sigema(i=0~s2len-1) (s2[i]-s1[j+i])^2*s2[i]

当fj=0时j是一个解。

既然要fft,这个加号很不爽,我们把s2翻转:

fj(0<j<=s1len-s2len) =sigema(i=0~s2len-1) (s2[s2len-i]-s1[j+i])^2*s2[s2len-i]

改为枚举s2len-i

fj(0<j<=s1len-s2len) =sigema(i=0~s2len-1) (s2[i]-s1[j-i+s2len])^2*s2[i]

这个时候发现s2len没法消啊,改一下定义,j表示以j为结尾的子串

fj(s2len-1<=j<=s1len-1) =sigema(i=0~s2len-1) (s2[i]-s1[j-i])^2*s2[i]

把它拆开跑三次fft就可以了。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const double pi=acos(-1.0);struct complex
{double r,i;complex(){}complex(double R,double I){r=R,i=I;}friend complex operator +(complex x,complex y){return complex(x.r+y.r,x.i+y.i);}friend complex operator -(complex x,complex y){return complex(x.r-y.r,x.i-y.i);}friend complex operator *(complex x,complex y){return complex(x.r*y.r-x.i*y.i,x.r*y.i+x.i*y.r);}
}A[410000],B[410000],C[410000]; int Re[410000];
void fft(complex *a,int n,int op)
{for(int i=0;i<n;i++)if(i<Re[i])swap(a[i],a[Re[i]]);for(int i=1;i<n;i<<=1){complex wn(cos(pi/i),sin(op*pi/i));for(int j=0;j<n;j+=(i<<1)){complex w(1,0);for(int k=0;k<i;k++,w=w*wn){complex t1=a[j+k],t2=a[j+k+i]*w;a[j+k]=t1+t2;a[j+k+i]=t1-t2;}}}
}char ss[410000];
int s1len,s1[410000],s2len,s2[410000],f[410000];
int aslen,as[410000];
int main()
{scanf("%s",ss);s1len=strlen(ss);for(int i=0;i<s1len;i++)if('a'<=ss[i]&&ss[i]<='z')s1[i]=ss[i]-'a'+1;else s1[i]=0;scanf("%s",ss);s2len=strlen(ss);for(int i=0;i<s2len;i++)if('a'<=ss[i]&&ss[i]<='z')s2[s2len-1-i]=ss[i]-'a'+1;else s2[s2len-1-i]=0;//~~~~~~~~~~~~~~~~~~~~read~~~~~~~~~~~~~~~~~~~~~~~~~~~    int n,m=s1len+s2len-2,L=0;for(n=1;n<=m;n*=2)L++;for(int i=1;i<=n;i++)Re[i]=(Re[i>>1]>>1)|((i&1)<<(L-1));memset(f,0,sizeof(f));//~~~~~~~~~~~~~~~~~~~~~init~~~~~~~~~~~~~~~~~~~~~~~~~~for(int i=0;i<=n;i++)A[i].r=s2[i]*s2[i]*s2[i],B[i].r=1;fft(A,n,1),fft(B,n,1);for(int i=0;i<n;i++)C[i]=A[i]*B[i];fft(C,n,-1);for(int i=s2len-1;i<s1len;i++)f[i]+=int(C[i].r/n+0.5);memset(A,0,sizeof(A));memset(B,0,sizeof(B));for(int i=0;i<=n;i++)A[i].r=2*s2[i]*s2[i],B[i].r=s1[i];fft(A,n,1),fft(B,n,1);for(int i=0;i<n;i++)C[i]=A[i]*B[i];fft(C,n,-1);for(int i=s2len-1;i<s1len;i++)f[i]-=int(C[i].r/n+0.5);memset(A,0,sizeof(A));memset(B,0,sizeof(B));for(int i=0;i<=n;i++)A[i].r=s2[i],B[i].r=s1[i]*s1[i];fft(A,n,1),fft(B,n,1);for(int i=0;i<n;i++)C[i]=A[i]*B[i];fft(C,n,-1);for(int i=s2len-1;i<s1len;i++)f[i]+=int(C[i].r/n+0.5);aslen=0;for(int i=s2len-1;i<s1len;i++)if(f[i]==0)as[++aslen]=i-s2len+1;printf("%d\n",aslen);for(int i=1;i<=aslen;i++)printf("%d\n",as[i]);return 0;
}

转载于:https://www.cnblogs.com/AKCqhzdy/p/10091986.html

bzoj4503: 两个串相关推荐

  1. Bzoj4503 两个串

    Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 398  Solved: 190 Description 兔子们在玩两个串的游戏.给定两个字符串S和T ...

  2. BZOJ4503:两个串(bitset)

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

  3. BZOJ4503 两个串 【fft】

    题目链接 BZOJ4503 题解 水水题. 和残缺的字符串那题几乎是一样的 同样转化为多项式 同样TLE 同样要手写一下复数才A #include<algorithm> #include& ...

  4. hdu 1867 求两个串的和最小 ,KMP

    题意:       给你两个字符串,让你求str1+str2,就是把1的后面和2的前面重叠的地方只显示一遍就行了 abc + bcd = abcd,要求和的长度最小,和最小的前提下求字典序最小,还有就 ...

  5. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  6. 递归法:求两个串的最大公共子序列的长度

    问题:求两个串的最大公共子序列的长度 举例: 子串: abcgxs 与sabxfh 其最大公共子序列的为abx,长度为3 public class Zixulie {public static int ...

  7. Simpsons’ Hidden Talents(KMP ,两个串的前后缀匹配)

    Simpsons' Hidden Talents 题目 给两个串,求S1的前缀和S2的后缀的最大匹配 思路 拼接两个串,处理出nxt数组,nxt[k] 即为所求,因为它们的最大匹配不能超过原串的长度, ...

  8. 题6:两个串的字符集是否相等

    题目: 只要出现的字符集相同就相等,不在乎数量. 思路: 借助辅助数组,先扫描第一个字符串,将出现的字符转换为辅助数组的下标并标记为1 package 字符串问题;import java.util.H ...

  9. 找出最接近的相似串(DP思想)

    题目:找出最接近的相似串 假设从一个串变化成另一个串所允许的操作只有两种:插入一个字符或者删除一个字符.无论是插入还是删除一个符号,均算作一次操作.一般情况下,度量两个串S1和S2的相似性,可以通过从 ...

最新文章

  1. Entity Framework VS Mybatis 不同点剖析
  2. 北京科技大学天津学院第三届智能车校内赛总决赛完美落幕
  3. 《移动项目实践》实验报告——Android数据存储
  4. 【CodeForces - 1153D】Serval and Rooted Tree(树形dp)
  5. C语言-字符串处理函数strcmp
  6. The file contains a character that cannot be represented in the current code pag
  7. 我的编程认知:多思考、多编码、多测试
  8. vuecli工程里面引入图片
  9. win10 配置flashbuilder debug
  10. 文档损坏了怎么修复?文档修复方法分享
  11. hdlbits刷题记录
  12. 在OpenFOAM中标记某些区域自适应加密
  13. 南昌航空大学计算机专业好吗,南昌航空大学王牌专业是什么
  14. 微信小程序(四)会员专区
  15. 微信公众号小程序如何做流媒体视频直播?
  16. ANSI终端常用控制字符
  17. 使用fastdb的感受
  18. 一种基于柔性压力传感器的机械手驱动系统
  19. 字符串连接操作符“+”
  20. thinksnsv4.6运行php,社交开源系统ThinkSNS V4.6.4更新,版本更新提示功能上线

热门文章

  1. 使用CancellationToken——而不是Thread.Sleep
  2. 使用HTML5和JavaScript创建音乐播放列表
  3. 谈判失败:Oracle 杀死 Java EE
  4. vue下拉框传值问题
  5. mybatis-plus实现自定义字段修改数据 后续更新CRUD
  6. linux中hadoop环境变量配置文件,Ubuntu中关于hadoop环境变量的设置方法
  7. java中fitlter,068.Python框架Django之DRF视图集使用
  8. mysql哨兵机制_Redis 哨兵机制以及底层原理深入解析,这次终于搞清楚了
  9. 多通路fpga 通信_基于USB通信的FPGA高速数据采集系统研究
  10. python elseif用法_Python关键字简介