福建工程学院第十四届ACM校赛J题题解
第六集,想不到你这个浓眉大眼的都叛变革命了
题意:
给你两个只包含01的字符串S和T,问你在允许一次错误的情况下,T是否能成为S的子串
思路:
这个问题的解法挺多,我是用fft匹配的,也比较简单,针对0和1匹配两次,第一次针对0就是把S串和T串中等于0的位置都标记成1,然后reverse一个串后进行fft,如果这两个位置都是0,就会出现1*1=1的情况,代表有一个位置匹配上了,0这样做一次,1这样做一次,他们的和就是匹配成功的次数,所以允许一次错误就是判断和是否大于len-1。
还有一个做法是指数哈希,判断两个串的哈希值的差是否是2^n,如果是的话check一下,就做出来了,2^n可以塞到hash或者map里。
还有exkmp等其他做法你们自行了解一下
代码实现
给出fft的做法(我只写了fft)
#include <iostream> #include <string> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int N = ; ll a[N],b[N]; const ll PMOD=(<<)+; const ll PR=; static ll qp[]; ll res[N]; struct NTT__container { NTT__container() { int t,i; for( i=; i<; i++)///注意循环上界与2n次幂上界相同 { t=<<i; qp[i]=quick_pow(PR,(PMOD-)/t); } } ll quick_pow(ll x,ll n) { ll ans=; while(n) { if(n&) ans=ans*x%PMOD; x=x*x%PMOD; n>>=; } return ans; } int get_len(int n)///计算刚好比n大的2的N次幂 { int i,len; for(i=(<<); i; i>>=) { if(n&i) { len=(i<<); break; } } return len; } inline void NTT(ll F[],int len,int type) { int id=,h,j,k,t,i; ll E,u,v; for(i=,t=; i<len; i++) { if(i>t) swap(F[i],F[t]); for(j=(len>>); (t^=j)<j; j>>=); } for( h=; h<=len; h<<=) { id++; for( j=; j<len; j+=h) { E=; for(int k=j; k<j+h/; k++) { u=F[k]; v=(E*F[k+h/])%PMOD; F[k]=(u+v)%PMOD; F[k+h/]=((u-v)%PMOD+PMOD)%PMOD; E=(E*qp[id])%PMOD; } } } if(type==-) { int i; ll inv; for(i=; i<len/; i++) swap(F[i],F[len-i]); inv=quick_pow(len,PMOD-); for( i=; i<len; i++) F[i]=(F[i]%PMOD*inv)%PMOD; } } inline void inv(ll *a,int len)///答案存在res中 { if(len==) { res[]=quick_pow(a[],PMOD-); return ; } inv(a,len>>);///递归 static ll temp[N]; memcpy(temp,a,sizeof(ll)*(len>>)); NTT(temp,len,); NTT(res,len,); int i; for(i=; i<len; i++) res[i]=res[i]*(-temp[i]*res[i]%PMOD+PMOD)%PMOD; NTT(res,len,-); memset(res+(len>>),,sizeof(ll)*(len>>)); } void mul(ll x[],ll y[],int len)///答案存在x中 { int i; NTT(x,len,);///先映射到频域上 NTT(y,len,);///先映射到频域上 for(i=; i<len; i++) x[i]=(x[i]*y[i])%PMOD;///在频域上点积 NTT(x,len,-);///再逆变换回时域 } } cal; ll x[N],y[N],z[N]; int main() { ios::sync_with_stdio(false); cin.tie(); int N; cin>>N; while(N--){ string s1,s2; cin>>s1>>s2; if(s2.length()>s1.length()){ puts("NO"); continue; } int len=cal.get_len(s1.length()); //做1匹配 memset(x,,len*sizeof(ll)); memset(y,,len*sizeof(ll)); memset(z,,len*sizeof(ll)); for(int i=;i<s1.length();i++){ x[i]=s1[i]-''; } for(int i=;i<s2.length();i++){ y[i]=s2[i]-''; } reverse(y,y+s2.length()); cal.mul(x,y,len); //for(int i=0;i<len;i++) for(int i=s2.length()-;i<s1.length();i++) z[i]+=x[i]; //做0匹配 memset(x,,len*sizeof(ll)); memset(y,,len*sizeof(ll)); for(int i=;i<s1.length();i++){ x[i]=-(s1[i]-''); } for(int i=;i<s2.length();i++){ y[i]=-(s2[i]-''); } reverse(y,y+s2.length()); cal.mul(x,y,len); //for(int i=0;i<len;i++) for(int i=s2.length()-;i<s1.length();i++) z[i]+=x[i]; bool flag=; for(int i=s2.length()-;i<s1.length();i++){ if(z[i]>=s2.length()-){ flag=; break; } } if(flag){ puts("YES"); } else { puts("NO"); } } }
福建工程学院第十四届ACM校赛J题题解的更多相关文章
- 福建工程学院第十四届ACM校赛M题题解 fwt进阶,手推三进制fwt
第九集,结束亦是开始 题意: 大致意思就是给你n个3进制的数字,让你计算有多少对数字的哈夫曼距离等于i(0<=i<=2^m) 思路: 这个是一个防ak题,做法是要手推公式的fwt 大概就这 ...
- 福建工程学院第十四届ACM校赛G题题解
外传:编剧说了不玩游戏不行 题意: 有n个石堆,我每次只能从某一堆中取偶数个石子,你取奇数个,我先手,先不能操作的人输.问最后谁能赢. 思路: 这个题仔细想想,就发现,取奇数的人有巨大的优势,因为假设 ...
- 福建工程学院第十四届ACM校赛B题题解
第二集,未来的我发量这么捉急的吗 题意: 有n个数,请问有多少对数字(i,j)(1<=i<j<=n),满足(a[i]^a[j])+((a[i]&a[j])<<1) ...
- 福建工程学院第十四届ACM程序设计大赛 - E - 外传:小晋逃生记
http://www.fjutacm.com/Contest.jsp?cid=705#P4 其实想清楚了就很简单,之前想了很多种方法,以为是二分什么的,看起来就像是一个单峰函数.但是发现直接暴力一波就 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- 湖南大学第十四届ACM程序设计新生杯(重现赛)G a+b+c+d=? (16进制与LL范围)
链接:https://ac.nowcoder.com/acm/contest/338/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K6 ...
- 湖南大学第十四届ACM程序设计新生杯(重现赛)I:II play with GG(博弈论||DP)
链接:https://ac.nowcoder.com/acm/contest/338/I 来源:牛客网 题目描述 IG won the S championship and many people a ...
- 湖南大学第十四届ACM程序设计新生杯(重现赛)
RANK 0 题数 0 期末复习没有参加,补几道喜欢的题. A: AFei Loves Magic 签到 思路 :不需考虑 碰撞 直接计算最终状态即可. #include<bits/stdc ...
- 湖南大学第十四届ACM程序设计新生杯 E.Easy Problem
E.Easy Problem Description: Zghh likes number, but he doesn't like writing problem description. So h ...
随机推荐
- MS14-068提权
• Ms14- • 库 • https://github.com/bidord/pykek • ms14-.py -u user@lab.com -s userSID -d dc.lab.com • ...
- Mybatis内置的日志工厂提供日志功能
Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具: SLF4J Apache Commons Logging Log4j 2 Log4j JDK logging 具体选择哪个日志 ...
- 石川es6课程---9、面向对象-基础
石川es6课程---9.面向对象-基础 一.总结 一句话总结: js老版本的面向对象和继承都不是很方便,新版的面向对象向其它语言靠拢,有了class,extends,constructor等关键字,用 ...
- 理解JVM
1.JVM运行时数据区 2.方法区 方法区垃圾回收的条件:该类的所有实例(堆内存中)被回收:加载该类字节码的类加载器被回收:所有的类对象(如Student.class)的引用被回收 一般采用可达性分析 ...
- ServletRequest与ServletResponse
http://lavasoft.blog.51cto.com/62575/275586/ 请求和相应是Web交互最基本的模式,在Servlet中,分别用HttpServletRequest与HttpS ...
- kubernetes学习:CKA考试题
1. 列出环境内所有的pv 并以 name字段排序(使用kubectl自带排序功能) kubectl get pv --sort-by=.metadata.name 2. 列出指定pod的日志中状态为 ...
- vuex 使用
一.什么是Vuex Vuex是一个专门为Vue.js应用程序开发的状态管理模式, 它采用集中式存储管理所有组件的公共状态, 并以相应的规则保证状态以一种可预测的方式发生变化 二. 为什么要使用Vuex ...
- 关于ckeditor粘贴图片自动上传
在之前在工作中遇到在富文本编辑器中粘贴图片不能展示的问题,于是各种网上扒拉,终于找到解决方案. 其原理为一下步骤: 监听粘贴事件:[用于插入图片] 获取光标位置:[记录图片插入位置] 获取剪切板内容: ...
- git merge --squash 选项合并commit操作实例
参考: [转] git merge 将多个commit合并为一条之--squash 选项 git checkout master git pull origin master # 本地先拉取最新的m ...
- 【ABAP系列】【第六篇】SAP ABAP7.50 之隐式增强
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列][第六篇]SAP ABAP7.5 ...