洛谷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位同学排成合唱队形. 合唱队形是指这样的一种队 ...
随机推荐
- fresco xml配置属性不起作用
在xml中配置加载等待图标,不起作用. 正确的如下: <?xml version="1.0" encoding="utf-8"?> <Line ...
- 稍稍解读下JDK8的HashMap
首先,源码中上来就有一大段注释,但最重要的就是第一句. 大意如下: 本map经常用作一个 binned (bucketed) hash table (下面有解释),但是,当bins很大的时候,它们会被 ...
- SpringBoot------全局异常捕获和自定义异常
1.添加Maven依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://w ...
- HttpWatch工具简介及使用技巧
一 概述: HttpWatch强大的网页数据分析工具.集成在Internet Explorer工具栏.包括网页摘要.Cookies管理.缓存管理.消息头发送/接受.字符查询.POST 数据和目录管理功 ...
- Android 集成ShareSDK分享QQ或空间成功后,回调却不执行的原因
AndroidMainifest.xml中的如箭头所示的id一定要与assets下ShareSDK.xml中配置的QQ的AppId一定要相同. 如下图
- Ubuntu 下 Sublime 无法输入中文?(已解决)
在 Ubuntu 里安装了 Sublime 却不能输入中文? 这可不好. 怎么办呢? Follow Me! 1 获得 sublime-imfix.c 文件 有 GitHub 账号的,可以从 https ...
- C#枚举类型和int类型相互转换
C#枚举类型和int类型相互转换 C# 枚举(Enum) 枚举是一组命名整型常量.枚举类型是使用 enum 关键字声明的. C# 枚举是值数据类型.换句话说,枚举包含自己的值,且不能继承或传递继承. ...
- jQuery跨域调用Web API
我曾经发表了一篇关于如何开发Web API的博客,链接地址:http://www.cnblogs.com/guwei4037/p/3603818.html.有朋友说开发是会开发了,但不知道怎么调用啊? ...
- AngularJS基础01 从HelloWorld说起
作者:arccosxy 转载请注明出处:http://www.cnblogs.com/arccosxy/ 准备工作 首先,创建一个名为index.html的HTML文件,代码如下: <!DOC ...
- Flask web开发之路十二
ge请求和post请求 ### get请求和post请求:1. get请求: * 使用场景:如果只对服务器获取数据,并没有对服务器产生任何影响,那么这时候使用get请求. * 传参:get请求传参是放 ...