博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3507: [Cqoi2014]通配符匹配
阅读量:5277 次
发布时间:2019-06-14

本文共 1321 字,大约阅读时间需要 4 分钟。

 必须要记住字符串很好卡一不小心就O(n²),别问我为什么这么说.....QAQ

 这题首先满足位数与字母两个限制,那么我们*分大块?分小块,求各块hash值,同时预处理出来每个字符串的前缀hash这样就可以O(1)对比了(千万不要忘记hash字符串对比的功能,我在考试的时候一脑抽就忘了......)

#include
#include
#include
#include
#define hash(a) Hash[a+2]using namespace std;typedef unsigned long long ULL;const ULL k=131;ULL Std[15][15],Hash[100030],tool[100030];int len,lon[130],l[15][15],z[130],y[130],L,R,lo[130],n;char s[100030];bool Over[130];inline bool blabla(int start,int num){ for(int i=1;i<=Std[num][0];i++) if((ULL)(hash(start+l[num][i]-1)-hash(start-1))==(ULL)Std[num][i]*tool[start]) start+=l[num][i]+1; else return 0; return 1;}void pre(){ tool[0]=1; for(int i=1;i<=100000;i++)tool[i]=tool[i-1]*k; scanf("%s",s); R=len=strlen(s); L=-1; Std[0][0]=1; Std[1][0]=1; for(int i=0;i
y[i]+1) { Over[i]=1; continue; } hash(0)=s[0]; for(int j=1;j
y[i])break; if(blabla(j,had)) { j+=lo[had]-1; had++; if(had==Std[0][0])break; } } if(had!=Std[0][0]) Over[i]=1; }}void print(){ for(int i=1;i<=n;i++) { if(Over[i]) printf("NO\n"); else printf("YES\n"); }}int main(){ pre(); work(); print(); return 0;}

 

转载于:https://www.cnblogs.com/TSHugh/p/7039662.html

你可能感兴趣的文章
js 对象和Json的转换,js及深度复制
查看>>
【0805作业】模拟多人爬山
查看>>
window.setTimeout() 和 window.setInterval() 使用说明
查看>>
大数据组件
查看>>
ActionResult的其它返回值
查看>>
Mac零散小技巧
查看>>
#135. 二维树状数组 3:区间修改,区间查询
查看>>
js String方法集合
查看>>
Python--day6
查看>>
UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
查看>>
第六天
查看>>
js 格式化带时区的日期
查看>>
XidianOJ 1037 倍流畅序列
查看>>
iOS-矩阵操作
查看>>
CSS中隐藏内容的3种方法及属性值
查看>>
每天一个linux命令(1):ls命令
查看>>
根据xml生成相应的对象类
查看>>
查看ASP.NET : ViewState
查看>>
移动WEB前端开发资源整合
查看>>
IP协议解读(三)
查看>>