Description

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

Input

两行两个字符串,分别代表S和T

Output

第一行一个正整数k,表示T在S中出现了几次
接下来k行正整数,分别代表T每次在S中出现的开始位置。按照从小到大的顺序输出,S下标从0开始。

两个串a,b相等(b中有通配符)当且仅当Σ(a[i]-b[i])2b[i]=0,其中a[i],b[i]为对应字符的对应编号,且通配符对应0

翻转S串并把T串用0补至与S等长后上式可化为卷积形式用fft计算

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<algorithm>
  5. int N,P;
  6. const double pi=3.14159265358979323846;
  7. int r[];
  8. struct cplx{
  9. double a,b;
  10. inline cplx(double r=,double i=){a=r;b=i;}
  11. inline cplx operator+(cplx x){return cplx(a+x.a,b+x.b);}
  12. inline cplx operator-(cplx x){return cplx(a-x.a,b-x.b);}
  13. inline cplx operator*(cplx x){return cplx(a*x.a-b*x.b,a*x.b+b*x.a);}
  14. }a[],b[];
  15. void dft(cplx*a,int t){
  16. for(int i=;i<N;i++)if(i>r[i])std::swap(a[i],a[r[i]]);
  17. for(int i=;i<N;i<<=){
  18. cplx w(cos(pi/i),t*sin(pi/i));
  19. for(int j=;j<N;j+=i<<){
  20. cplx e(),*b=a+j,*c=b+i;
  21. for(int k=;k<i;k++,e=e*w){
  22. cplx x=b[k],y=c[k]*e;
  23. b[k]=x+y,c[k]=x-y;
  24. }
  25. }
  26. }
  27. }
  28. char s1[],s2[];
  29. int v1[],v2[];
  30. int h1[],h2[];
  31. int as[],ap=;
  32. int l1,l2,h3=;
  33. int main(){
  34. input:{
  35. scanf("%s%s",s1,s2);
  36. l1=strlen(s1)-;
  37. l2=strlen(s2)-;
  38. for(int i=;i<=l1;i++)v1[i]=s1[l1-i]-'a'+;
  39. for(int i=;i<=l2;i++)v2[i]=s2[i]!='?'?s2[i]-'a'+:;
  40. for(int i=;i<=l2;i++)h3+=v2[i]*v2[i]*v2[i];
  41. }
  42. init:{
  43. for(N=,P=;N<=l1+;N<<=,++P);
  44. N<<=,++P;
  45. for(int i=;i<N;i++)r[i]=r[i>>]>>|(i&)<<P;
  46. }
  47. calc:{
  48. for(int i=;i<=l1;i++)a[i]=cplx(v1[i]*v1[i]);
  49. for(int i=;i<=l1;i++)b[i]=cplx(v2[i]);
  50. for(int i=l1+;i<N;i++)a[i]=b[i]=cplx();
  51. dft(a,),dft(b,);
  52. for(int i=;i<N;i++)a[i]=a[i]*b[i];
  53. dft(a,-);
  54. for(int i=;i<=l1;i++)h1[i]=(int)(a[i].a/N+0.5);
  55.  
  56. for(int i=;i<=l1;i++)a[i]=cplx(v1[i]);
  57. for(int i=;i<=l1;i++)b[i]=cplx(v2[i]*v2[i]);
  58. for(int i=l1+;i<N;i++)a[i]=b[i]=cplx(,);
  59. dft(a,),dft(b,);
  60. for(int i=;i<N;i++)a[i]=a[i]*b[i];
  61. dft(a,-);
  62. for(int i=;i<=l1;i++)h2[i]=(int)(a[i].a/N+0.5);
  63. }
  64. output:{
  65. for(int i=l1;i>=l2;i--)if(h1[i]-*h2[i]+h3==)as[ap++]=l1-i;
  66. printf("%d\n",ap);
  67. for(int i=;i<ap;i++)printf("%d\n",as[i]);
  68. }
  69. return ;
  70. }

bzoj4403 两个串的更多相关文章

  1. bzoj 4503 两个串

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

  2. BZOJ4503: 两个串

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

  3. SPOJ 1811 Longest Common Substring (后缀自动机第一题,求两个串的最长公共子串)

    题目大意: 给出两个长度小于等于25W的字符串,求它们的最长公共子串. 题目链接:http://www.spoj.com/problems/LCS/ 算法讨论: 二分+哈希, 后缀数组, 后缀自动机. ...

  4. BZOJ 4503: 两个串 [FFT]

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

  5. 【BZOJ4503】两个串(FFT)

    [BZOJ4503]两个串(FFT) 题面 给定串\(S\),以及带通配符的串\(T\),询问\(T\)在\(S\)中出现了几次.并且输出对应的位置. \(|S|,|T|<=10^5\),字符集 ...

  6. bzoj4503: 两个串 bitset

    目录 题目链接 题解 代码 题目链接 bzoj4503: 两个串 题解 暴一发bitset f[i][j] 表示 S[1..i] 是否有个后缀能匹配 T[1..j] 那么假设 S[i+1] 能匹配 T ...

  7. URAL 1517 Freedom of Choice (后缀数组 输出两个串最长公共子串)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/whyorwhnt/article/details/34075603 题意:给出两个串的长度(一样长) ...

  8. 【BZOJ 4503】4503: 两个串 (FFT)

    4503: 两个串 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 497  Solved: 226 Description 兔子们在玩两个串的游戏.给 ...

  9. SPOJ 1811 Longest Common Substring(求两个串的最长公共子串 || 或者n个串)

    http://www.spoj.com/problems/LCS/ 题目:求两个串的最长公共子串 参考:https://www.cnblogs.com/autoint/p/10345276.html: ...

随机推荐

  1. 【乱码】运行java -jar xx.jar存到hbase里的数据乱码

    程序在Eclipse里运行没有问题,但是打成jar包之后写入hbase里的数据会有乱码,ES里正常 经过测试,运行命令里加上-Dfile.encoding=utf-8 就可以正常写入,但是cmd命令里 ...

  2. SDN前瞻 该来的来了!SDN 软件定义网络

    SDDC:Software Defined Data Center 软件定义数据中心,全数据中心软件化. 在我们接触SDN概念之前,服务器虚拟化,软件虚拟化技术已经是非常成熟了.如果网络能够被虚拟化, ...

  3. UVa 1637 纸牌游戏(全概率公式)

    https://vjudge.net/problem/UVA-1637 题意: 36张牌分成9堆,每堆4张牌.每次可以拿走某两堆顶部的牌,但需要点数相同.每种拿法的概率均为1/5.求成功概率. 思路: ...

  4. Maven简单的配置Junit测试及使用简单的mock

    1.maven依赖配置如下 <dependency> <groupId>org.mockito</groupId> <artifactId>mockit ...

  5. django urlencode

    from django.utils.http import urlquote a = urlquote('分享') print(a)

  6. python 作用域,命名空间

    def scope_test(): def do_local(): spam = "local spam" def do_nonlocal(): nonlocal spam spa ...

  7. 雷林鹏分享:Ruby CGI Cookies

    Ruby CGI Cookies HTTP协议是无状态协议.但对于一个商业网站,它需要保持不同的页面间的会话信息. 如用户在网站注册过程中需要跳转页面,但又要保证之前填写的信息部丢失. 这种情况下 C ...

  8. sql语句中处理金额,把分换算成元

    问题,sql语句中直接将金额/100返回的结果会有多个小数位. as value from account as acc left join conCategory as cate on acc.ca ...

  9. Appium 自动化测试(8) -- Appium Python client -- API

    最好的学习方法,就是看源码! 在  \appium\webdriver\webdriver.py ,新增了两个封装好定位安卓元素的方法,如  find_element_by_accessibility ...

  10. POJ 2409 Let it Bead (Polya定理)

    题意 用k种颜色对n个珠子构成的环上色,旋转翻转后相同的只算一种,求不等价的着色方案数. 思路 Polya定理 X是对象集合{1, 2, --, n}, 设G是X上的置换群,用M种颜色染N种对象,则不 ...