(不知道xjb KMP可不可以做的说)

(假设下标都以0开头)

对于有一定偏移量的序列的 对应位置 匹配或者数值计算的题,这里是有一种套路的,就是把其中一个序列翻转过来,然后卷积一下,所得到的新序列C的每一个位置就包含了 所有原来一定偏移量的位置的乘积和。

对于这个题,我们只需要找到一种方法,使相同的字符代表的数乘积是一个特殊的值,然后*可以看成0(*可以匹配任意字符),这样使得卷积后的位置是特殊值的就可以匹配。

而且这种特殊值需要满足: 两个特殊值相加之后还是特殊值,两个不是特殊值相加还不是特殊值,一个是一个不是相加也不是特殊值。

如果要去找到所有满足这个性质的集合的话,貌似是比较困难的QWQ,哪怕就要找一个我也不会啊QWQ

但是有一种很好的方法可以拟合这个集合,那就是设特殊值是整数,然后第一个串里某个字符的权值和第二个串中的这种字符的权值互为倒数。

当第一个串中的字符权值是完全在实数域上随机的话,那么就几乎可以拟合上述集合了,因为可以证明若干个随机实数的和为整数的概率趋近于0.

介于我一直对luogu的<ctime>有心理阴影,所以这里的权值并不是随机的,而是每个字符的编码+2333.

(结果竟然过了2333)

/*
f[i] -> 开头的偏移量 = i-m+1 的val_sum
所以统计 f[m-1] ~ f[n-1] 即可 (对应偏移量 0 ~ n-m)
*/
#include<bits/stdc++.h>
#define ll long long
#define D long double
#define E complex<long double>
using namespace std;
const D pi=acos(-1),eps=1e-9;
const int maxn=300005; E a[maxn*4],b[maxn*4];
int r[maxn*4],n,m,N,ans,p[maxn],l;
char S[maxn],s[maxn]; inline bool isZ(D x){ return fabs(x-floor(x+0.5))<=eps;} inline bool isL(char x){ return x>='a'&&x<='z';} inline void build(){
for(int i=0;i<m;i++) if(isL(s[i])) a[m-i-1]=1/(D)(s[i]+2333);
for(int i=0;i<n;i++) if(isL(S[i])) b[i]=S[i]+2333; for(N=1;N<(n+m-1);N<<=1) l++;
for(int i=0;i<N;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
} inline void FFT(E *c,int f){
for(int i=0;i<N;i++) if(i<r[i]) swap(c[i],c[r[i]]); for(int i=1;i<N;i<<=1){
E omega(cos(pi/i),f*sin(pi/i));
for(int P=i<<1,j=0;j<N;j+=P){
E now(1,0);
for(int k=0;k<i;k++,now*=omega){
E x=c[k+j],y=c[j+k+i]*now;
c[j+k]=x+y;
c[j+k+i]=x-y;
}
}
} if(f==-1) for(int i=0;i<N;i++) c[i]/=N;
} inline void solve(){
FFT(a,1),FFT(b,1);
for(int i=0;i<N;i++) a[i]*=b[i];
FFT(a,-1); for(int i=m-1;i<n;i++) if(isZ(a[i].real())) p[++ans]=i-m+2;
} int main(){
scanf("%d%d",&m,&n);
scanf("%s",s),scanf("%s",S); build(),solve(); printf("%d\n",ans);
for(int i=1;i<=ans;i++) printf("%d ",p[i]);
return 0;
}

  

洛谷 P4173 残缺的字符串的更多相关文章

  1. 洛谷 P4173 残缺的字符串 (FFT)

    题目链接:P4173 残缺的字符串 题意 给定长度为 \(m\) 的模式串和长度为 \(n\) 的目标串,两个串都带有通配符,求所有匹配的位置. 思路 FFT 带有通配符的字符串匹配问题. 设模式串为 ...

  2. 洛谷P4173 残缺的字符串(FFT)

    传送门 话说为什么字符串会和卷积扯上关系呢……到底得脑洞大到什么程度才能想到这种东西啊……大佬太珂怕了…… 因为通配符的关系,自动机已经废了 那么换种方式考虑,如果两个字符串每一位对应的编码都相等,那 ...

  3. 洛谷P4173 残缺的字符串

    题目大意: 两个带通配符的字符串\(a,b\),求\(a\)在\(b\)中出现的位置 字符串长度\(\le 300000\) 考虑魔改一发\(kmp\),发现魔改不出来 于是考虑上网搜题解 然后考虑\ ...

  4. Luogu P4173 残缺的字符串-FFT在字符串匹配中的应用

    P4173 残缺的字符串 FFT在字符串匹配中的应用. 能解决大概这种问题: 给定长度为\(m\)的A串,长度为\(n\)的B串.问A串在B串中的匹配数 我们设一个函数(下标从\(0\)开始) \(C ...

  5. P4173 残缺的字符串(FFT字符串匹配)

    P4173 残缺的字符串(FFT字符串匹配) P4173 解题思路: 经典套路将模式串翻转,将*设为0,设以目标串的x位置匹配结束的匹配函数为\(P(x)=\sum^{m-1}_{i=0}[A(m-1 ...

  6. BZOJ1856或洛谷1641 [SCOI2010]生成字符串

    BZOJ原题链接 洛谷原题链接 可以将\(1\)和\(0\)的个数和看成是\(x\)轴坐标,个数差看成\(y\)轴坐标. 向右上角走,即\(x\)轴坐标\(+1\),\(y\)轴坐标\(+1\),表示 ...

  7. 卡特兰数 洛谷P1641 [SCOI2010]生成字符串

    卡特兰数 参考博客 介绍 卡特兰数为组合数学中的一种特殊数列,用于解决一类特殊问题 设\(f(n)\)为卡特兰数的第n项 其通项公式为 \[f(n)=\frac{2n\choose n}{n+1} \ ...

  8. 洛谷 P1641 [SCOI2010]生成字符串

    洛谷 这题一看就是卡塔兰数. 因为\(cnt[1] \leq cnt[0]\),很显然的卡塔兰嘛! 平时我们推导卡塔兰是用一个边长为n的正方形推的, 相当于从(0,0)点走到(n,n)点,向上走的步数 ...

  9. 洛谷P1852 奇怪的字符串

    题目描述 输入两个01串,输出它们的最长公共子序列的长度 输入输出格式 输入格式: 一行,两个01串 输出格式: 最长公共子序列的长度 输入输出样例 输入样例#1: 复制 01010101010 00 ...

随机推荐

  1. [BZOJ3594] [Scoi2014]方伯伯的玉米田 二维树状数组优化dp

    我们发现任何最优解都可以是所有拔高的右端点是n,然后如果我们确定了一段序列前缀的结尾和在此之前用过的拔高我们就可以直接取最大值了然后我们在这上面转移就可以了,然后最优解用二维树状数组维护就行了 #in ...

  2. c++编辑器下载地址

    https://msdn.itellyou.cn/ 输入上述地址选中下图所示的按钮:

  3. Switf与OC混合开发流程

    看着身边越来越多的小伙伴转入Swift,本人也跟随潮流,转战Swift了~下面是初步写入的一个Swift项目框架. 1.创建项目,这个应该不用说了,语言swift 2.CocoaPods 导入第三方 ...

  4. 搭建eova开发环境

    1.安装好maven 2.下载Eova项目解压到文件夹eova下 3.dos命令到eova文件夹下执行mvn eclipse:eclipse(注:构建eclipse项目命令) 4.修改*.tag文件错 ...

  5. oracle有关游标的知识

    一:前言 今天我自己第二次写游标,我擦,觉得自己在数据库方面需要很大的提高啊.今天遇到三个问题,第一个是oracle数据库中的数据拆分的问题,这个我用regexp_substr来进行解决,第二个问题就 ...

  6. NGINX: 限制连接的实践 (Defense DDOS)

    参考: [ nginx防止DDOS攻击配置 ] 关于限制用户连接,Nginx 提供的模块: [ ngx_http_limit_req_module ] [ ngx_http_limit_conn_mo ...

  7. Mysql添加视图

    有时候复杂的查询需要创建视图,可以简化查询.我们也可以将视图包装成对象,这样查询后在Java中也可以直接封装为对象. 原来的表结构

  8. hashlib,suprocess,configparser模块

    十 hashlib模块 1.什么叫hash:hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值 2.hash值的特点是: 2.1 只要传入的内容一样,得到的hash值必然一样==== ...

  9. centos python2.6升级到2.7出现的问题

    centos自带的python版本为2.6,在使用tornado时会出现如下报错: NameError: global name 'memoryview' is not defined 因此需要升级到 ...

  10. spring 声明式事务中try catch捕获异常

    原文:http://heroliuxun.iteye.com/blog/848122 今天遇到了一个这个问题 最近遇到这样的问题,使用spring时,在业务层需要捕获异常(特殊需要),当前一般情况下不 ...