洛谷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位同学排成合唱队形. 合唱队形是指这样的一种队 ...
随机推荐
- c++ clr编译dll在c#调用时出现“试图加载不正确的格式”“找不到dll”错误的解决
用depends发现缺了一堆API-MS-WIN什么的dll,网上查找是因为少了VC++2010,VC++2015等一系列,装好后仍然不行,原来这种错误并不是该原因导致的,也并不缺少那些dll(dep ...
- Java知多少(23)类的基本运行顺序
我们以下面的类来说明一个基本的 Java 类的运行顺序: public class Demo{ private String name; private int age; public Demo(){ ...
- Java知多少(67)面向字符的输入流
字符流是针对字符数据的特点进行过优化的,因而提供一些面向字符的有用特性,字符流的源或目标通常是文本文件. Reader和Writer是java.io包中所有字符流的父类.由于它们都是抽象类,所以应使用 ...
- azkaban在centos下的部署安装
azkaban 是一个用Java开发的开源调度工具workflow. 下面介绍具体安装过程,我这里使用的版本是3.43.0,使用的是solo运行模式. 编译 git clone https://git ...
- js 异步请求
<p id="check"> <label>验证码:</label> <input class="vid" id=&q ...
- win7怎么打开加锁文件夹
在windows 7下,C:\Documents and Settings文件夹是默认锁定的,很多时候要进入进行解除锁定,根据本人实践的经历略作介绍. 1.打计算机,进入c盘文件夹,2.分别点击“组织 ...
- 奇怪的git代理超时问题
曾几何时在公司用代理上过网,后来在家里使用git訪问csdn code和github就出现代理超时的问题,例如以下: $ git clone https://github.com/bumptech/g ...
- Markdown 标题
用 Markdown 书写时,只需要在文本前面加上 # 即可创建标题,Markdown 支持六级标题,语法及效果如下 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五 ...
- 【.NetCore学习】ubuntu16.04 搭建.net core mvc api 运行环境
查看linux内核版本 uname -a 打印结果 python@ubuntu:~$ uname -a Linux ubuntu 4.4.0-31-generic #50-Ubuntu SMP Wed ...
- 设备重力感应 window.DeviceOrientationEvent
设备屏幕方向与运动 https://developers.google.cn/web/fundamentals/native-hardware/device-orientation/ MDN devi ...