洛谷P3234 抄卡组 [HNOI2014] 字符串hash
正解:字符串hash
解题报告:
字符串hash是字符串匹配中很常见的一个方法,原理也很好懂,这里就不做太多阐述辣有时间放到hash笔记里面去QAQ
题意不说了挺好理解的,自带一句话概括好评
然后直接说正解QAQ
首先要想到对于读入,有三种情况
第一种,麻油有通配符的,这种最简单,直接读的时候判断一下就好
第二种,全都有通配符,显然这样的情况下,只要前后缀都是一样的,中间一定能用通配符操作一番之后变成一样的,只要判断前缀后缀就好
第三种,有的有通配符有的麻油,这种情况相对来说复杂一些,首先可以把麻油的按照第一种的判断了,然后把有的和麻油的匹配一下,匹配的话只要看通配符之间的484都相等就好
然后想到之后实现一下就好了,,,没了,,,
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define fr first
#define sc second
#define rg register
#define gc getchar()
#define mp make_pair
#define ll unsigned long long
#define rp(i,x,y) for(rg int i=x;i<=y;++i)
#define my(i,x,y) for(rg int i=x;i>=y;--i) const ll bas=,N=+,L=1e7+;const bool gdgs=;
ll powbs[L]={}; struct node
{
vector<ll>hsh,hv;bool ishv;int lth;
il void rd()
{
char ch=gc;hsh.clear();hv.clear();ishv=;lth=;hsh.push_back();while(ch=='\n' || ch=='\r')ch=gc;
while(ch!='\n' && ch!='\r'){++lth;hsh.push_back(hsh[lth-]*bas+ch);if(ch=='*')hv.push_back(lth);ch=gc;}
ishv=hv.size();
}
il ll gths(){return hsh[lth];}
il int gtfr(){return ishv?hv[]:-;}
il int gtlst(){return ishv?lth-(*--hv.end()):-;}
il ll cal(int l,int r){return (l<= || r>lth)?-:hsh[r]-hsh[l-]*powbs[r-l+];}
}cd[N]; il int read()
{
rg char ch=gc;rg int x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void pre(){rp(i,,1e7+)powbs[i]=powbs[i-]*bas;}
il bool mch(int x,int y)
{
int l=cd[x].gtfr();if(cd[x].cal(,l-)!=cd[y].cal(,l-))return ;
int r=cd[x].gtlst()-;if(cd[x].cal(cd[x].lth-r,cd[x].lth)!=cd[y].cal(cd[y].lth-r,cd[y].lth))return ;
int p1=,p2=l;
while(p1+<cd[x].hv.size() && p2+r<cd[y].lth)
{
int lth=cd[x].hv[p1+]-cd[x].hv[p1]-;ll num=cd[x].cal(cd[x].hv[p1]+,cd[x].hv[p1+]-);
while(gdgs){if(p2+lth-+r>=cd[y].lth)return ;if(cd[y].cal(p2,p2+lth-)==num){++p1,p2+=lth;break;}++p2;}
}
return (p1+==cd[x].hv.size());
}
il void wk()
{
int n=read(),lst=;bool as=;rp(i,,n){cd[i].rd();if(!cd[i].ishv){if(lst && cd[lst].gths()!=cd[i].gths())as=;lst=i;}}
if(!as)return void(printf("N\n"));
if(!lst)
{
vector< pair<int,int> >cal;
cal.clear();rp(i,,n)cal.push_back(mp(cd[i].gtfr()-,i));sort(cal.begin(),cal.end());
rp(i,,n-)if(cd[cal[i].sc].cal(,cal[i-].fr)!=cd[cal[i-].sc].cal(,cal[i-].fr))return void(printf("N\n"));
cal.clear();rp(i,,n)cal.push_back(mp(cd[i].gtlst(),i));sort(cal.begin(),cal.end());
rp(i,,n-)if(cd[cal[i].sc].cal(cd[cal[i].sc].lth-cal[i-].fr+,cd[cal[i].sc].lth)!=cd[cal[i-].sc].cal(cd[cal[i-].sc].lth-cal[i-].fr+,cd[cal[i-].sc].lth))return void(printf("N\n",i));
return void(printf("Y\n"));
}
rp(i,,n)if(cd[i].ishv)if(!mch(i,lst))return void(printf("N\n"));return void(printf("Y\n"));
} int main()
{
// freopen("ckz.in","r",stdin);freopen("ckz.out","w",stdout);
pre();int T=read();while(T--)wk();
return ;
}
然后注意下+1-1什么的细节挺多的,,,然后我开始WA了嘛,改了半天突然就对了,我也不知道怎么对的QAQ?
洛谷P3234 抄卡组 [HNOI2014] 字符串hash的更多相关文章
- 洛谷 P4036 [JSOI2008]火星人(splay+字符串hash)
题面 洛谷 题解 首先,我们知道求最长公共前缀可以用二分答案+hash来求 因为有修改操作, 考虑将整个字符串的hash值放入splay中 接着就是splay的基本操作了 Code #include& ...
- 洛谷P3538 [POI2012]OKR-A Horrible Poem [字符串hash]
题目传送门 A Horrible Poem 题目描述 Bytie boy has to learn a fragment of a certain poem by heart. The poem, f ...
- 动态规划 洛谷P1048 [NOIP2005 普及组] 采药
洛谷P1048 [NOIP2005 普及组] 采药 洛谷的一个谱架-的题目,考的是01背包问题,接下来分享一下我的题解代码. AC通过图: 我的代码: 1 //动态规划 洛谷P1048 [NOIP20 ...
- 求最长子序列(非连续)的STL方法 - 洛谷P1020 [NOIP1999 普及组] 导弹拦截
先给出例题:P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 大佬题解:P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 ...
- BZOJ3191或洛谷2059 [JLOI2013]卡牌游戏
BZOJ原题链接 洛谷原题链接 我们可以倒着来\(DP\). 设\(f[i][j]\)表示剩余\(i\)个人,从庄家数起第\(j\)个人的胜率,设当前枚举到第\(k\)张牌,该情况下这一轮淘汰的位置为 ...
- 洛谷 P2059 [JLOI2013]卡牌游戏(概率dp)
题面 洛谷 题解 \(f[i][j]\)表示有i个人参与游戏,从庄家(即1)数j个人获胜的概率是多少 \(f[1][1] = 1\) 这样就可以不用讨论淘汰了哪些人和顺序 枚举选庄家选那张牌, 枚举下 ...
- 洛谷 P3263 [JLOI2015]有意义的字符串
洛谷 首先,看到\((\frac{(b+\sqrt{d})}{2})^n\),很快能够想到一元二次方程的解\(\frac{-b\pm\sqrt{\Delta}}{2a}\). 所以可以推出,\(\fr ...
- 洛谷P1514 [NOIP2010提高组T4]引水入城
P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...
- 【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]
以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队 ...
随机推荐
- Java编程的逻辑 (83) - 并发总结
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- 常用curl测试命令
1.curl 基础用法 2.curl 常用 3.curl 拓展 1.curl基础用法 语法:# curl [option] [url] curl除了用以请求数据,还可以用来上传下载 -A/--user ...
- Java知多少(6)第一个程序示例
跟随世界潮流,第一个Java程序输出“Hell World!”. 通过Eclipse运行程序 启动Eclipse,在菜单中选择“文件 --> 新建 --> Java项目”,弹出对话框: 图 ...
- Java如何匹配列表中的电话号码?
在Java编程中如何匹配列表中的电话号码? 以下示例显示如何使用phone.matches(phoneNumberPattern)方法将列表中的电话号码与指定模式相匹配. package com.yi ...
- 完全卸载MySQL
1.先停止mysql服务,cmd模式下输入net stop mysql; 或者在图形服务面板停止mysql服务 2.进入控制面板卸载mysql; 3.windows+R运行“regedit”文件,打开 ...
- [Tensorflow] Cookbook - The Tensorflow Way
本章介绍tf基础知识,主要包括cookbook的第一.二章节. 方针:先会用,后定制 Ref: TensorFlow 如何入门? Ref: 如何高效的学习 TensorFlow 代码? 顺便推荐该领域 ...
- ThinkingInJava 学习 之 0000003 控制执行流程
1. if-else 2. 迭代 1. while 2. do-while 3. for 4. 逗号操作符 Java里唯一用到逗号操作符的地方就是for循环的控制表达式. 在控制表达式的初始化和步进控 ...
- WebApi中的Session与Token间的处理对接
首先,说起来创建session,一般会针对注册登录或者授权等情况: session 从字面上讲,就是会话.这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征(长 ...
- redis aof和rdb区别
转自https://blog.csdn.net/m0_38110132/article/details/76906422 1.前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由 ...
- image-set实现Retina屏幕下图片显示详细介绍
支持image-set:如果你的浏览器支持image-sete,而且是普通显屏下,此时浏览器会选择image-set中的@1x背景图像: Retina屏幕下的image-set:如果你的浏览器支持im ...