(不知道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. Linux(CentOS)用split命令分割文件

    在 Linux 里,稍加不注意有可能会产生很大体积的日志文件,哪怕几百M,拖下来分析也很浪费时间,这个时候,如果可以把文件切割成 N 个小文件,拿最后一个文件就可以看到最近的日志了.有一些手段,比如用 ...

  2. 使用Idea远程部署调试tomcat

    转自:http://blog.csdn.net/jane1229/article/details/52402119 远程服务器的配置: 1.在远程服务器安装jdk和tomcat 2.配置环境变量 PA ...

  3. JVM 性能排查--查看哪个对象占用内存大

    参考:http://blog.csdn.net/chenleixing/article/details/44227327/ 1.  在IE地址栏中输入:http://localhost/test/in ...

  4. mysql root设置密码 linux

    成功方案 mysqld_safe --user=mysql --skip-grant-tables --skip-networking & [root@localhost ~]# mysql ...

  5. 卡片选项页面 JTabbedPane 的使用

    package first; import javax.swing.*; import java.awt.*; import java.awt.event.*; class TtpDemo exten ...

  6. HDU 1798 Tell me the area (数学)

    题目链接 Problem Description     There are two circles in the plane (shown in the below picture), there ...

  7. MySQL 进阶(待发布)

    视图 存储过程 触发器 基本函数

  8. 本地搭建SVN局域网服务器【转】

    转自:http://blog.csdn.net/sunbaigui/article/details/8466310 参考链接:http://tortoisesvn.net/docs/nightly/T ...

  9. 【洛谷P3709】大爷的字符串题

    看这题网上居然还没人写blog,怕是都去看洛谷自带的了-- 你才是字符串!你全家都是字符串!这题跟字符串没多大关系,只是出题人lxl想要吐槽某中学而已--... 其实这题说白了就是问区间里出现最多的数 ...

  10. 无界面运行Jmeter压测脚本

    今天在针对单一接口压测时出现了从未遇到的问题,设好并发量后用调度器控制脚本的开始和结束,但在脚本应该自动结束时间,脚本却停不下来,手动stop报告就会有error率,卡了我很久很久不能解决,网络上也基 ...