洛谷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位同学排成合唱队形. 合唱队形是指这样的一种队 ...
随机推荐
- 关于指针*前后const代表的意思——记住一个口诀“左内右本”
记住一个口诀“左内右本”:const出现在*的左边,则说明指针所指向的内容是常量const出现在*的右边,则说明指针本身是常量如果*左右两边都出现const,那么说明指针本事是常量,它所指向的内容也是 ...
- Android中Sqlite数据库多线程并发问题
最近在做一个Android项目, 为了改善用户体验,把原先必须让用户“等待”的过程改成在新线程中异步执行.但是这样做遇到了多个线程同时需要写Sqlite数据库,导致操作数据库失败. 本人对Java并不 ...
- MySql表结构修改详解
修改表的语法=========================增加列[add 列名]=========================①alter table 表名 add 列名 列类型 列参数[加的 ...
- (转)使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解
使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解 本文用代码简单介绍cjson的使用方法,1)创建json,从json中获取数据.2)创建json数组和解析json数组 1. 创 ...
- web前端之jQuery
前端的核心编程语言是javaScript,jQuery的出现简化了前端编程,以前看过一些,现在不用大都忘记了,以下总结几个前端技巧. 作为面向对象的脚本语言,注意区别jQuery和DOM对象,及其方法 ...
- ORM跨表查询问题
环境准备: 表结构 from django.db import models # Create your models here. class Publisher(models.Model): id ...
- 网络通信协议三之TCP/IP模型详解
TCP/IP模型 注:PDU:Protocol Date Unit:表示对等层之间传递的数据单位 TCP:Transmission Control Protocol:传输控制协议 UDP:User D ...
- MongoDB数据库基础
MongoDB简介 MongoDB是一种文档型的非关系型数据库(NoSQL),举例如下: {“foo”:,"greeting":"Hello,world!"} ...
- Db2性能:系统CPU高问题分析的一些思路
Db2性能:系统CPU高问题分析的一些思路 1. 如何判断CPU高? 有很多操作系统的命令可以看出来,比如ps -elf,iostat, vmstat, top/topas, 2. 收集数据 CPU高 ...
- 将多个图片合并到一个TIF文件里(非 GDAL) 优化版
不知道为什么,网上对TIF的操作的资料少得可怜,包括CodeProject上都没有找到多少,在网上大多用GDAL,但这个东西,对只想做个合并图片的功能来说,实在是牛刀杀鸡,(9个DLL要带全,相当的恐 ...