bzoj3574[Hnoi2014]抄卡组
http://www.lydsy.com/JudgeOnline/problem.php?id=3574
我们发现如果所有的字符串都有*,那么只需要比较他们的“前缀”和“后缀”相同即可。“前缀”指第一个*前的字符串,“后缀”指最后一个*后的字符串
如果存在一个字符串没有*,那么要求其他串都能跟这个串匹配,用哈希即可
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
#include<cassert>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj using namespace std; typedef long long LL;
typedef unsigned long long ULL;
typedef double DB;
typedef pair<int,int> PII;
typedef pair<DB,DB> PDD;
typedef complex<DB> CP;
typedef vector<int> VI; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b) for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define fi first
#define se second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define SF scanf
#define PF printf
#define two(k) (1<<(k))
#define SZ(x) (int(x.size()))
#define all(x) (x).begin(),(x).end()
#define ire(i,v,x) for(i=0,v=i<SZ(x)?x[i]:0;i<SZ(x);v=x[++i]) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} inline int sgn(DB x){if(abs(x)<1e-)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
}
LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxn=;
const int sumlen=; int n;
char mem[sumlen];int now;
int len[maxn],from[maxn],to[maxn];
int mark[maxn],com,nowlen,maxlen; #define P 991
ULL power[sumlen];
ULL sum[sumlen];
void read()
{
int i,j;
n=gint();
now=;
com=-;
maxlen=;
re(i,,n)
{
from[i]=now+;
cin>>mem+now+;
len[i]=strlen(mem+now+);
to[i]=from[i]+len[i]-;
now=to[i];
mark[i]=;
re(j,from[i],to[i])if(mem[j]=='*'){mark[i]=;break;}
if(!mark[i])com=i;
upmax(maxlen,len[i]);
}
power[]=;
while(nowlen<maxlen)power[nowlen+]=power[nowlen]*P,nowlen++;
re(i,,now)sum[i]=sum[i-]*P+mem[i];
} ULL gethash(int l,int r){return sum[r]-sum[l-]*power[r-l+];} int ch[maxn];
char RT[sumlen]; int check(int a,int b)
{
int head=from[b];
for(int l=from[a],r;l<=to[a];l=r+)
{
while(mem[l]=='*' && l<=to[a]) l++;
if(l>to[a])break;
for(r=l;r+<=to[a] && mem[r+]!='*';r++);
ULL RIG=gethash(l,r);
while(head+(r-l+)-<=to[b] && gethash(head,head+(r-l+)-)!=RIG) head++;
if(head+(r-l+)->to[b])return ;
head+=r-l+;
}
if(mem[from[a]]!='*')
{
int i,l=from[a],r;
for(r=l;r+<=to[a] && mem[r+]!='*';r++);
re(i,l,r)if(mem[i]!=mem[from[b]+i-l])return ;
}
if(mem[to[a]]!='*')
{
int i,l,r=to[a];
for(l=r;l->=from[a] && mem[l-]!='*';l--);
re(i,l,r)if(mem[i]!=mem[to[b]-(r-i)])return ;
}
return ;
} int check()
{
if(com!=-)
{
int i;
re(i,,n)
{
if(!mark[i] && (len[i]!=len[com] || gethash(from[i],to[i])!=gethash(from[com],to[com])))return ;
if(mark[i] && !check(i,com))return ;
}
return ;
}
else
{
int i,j,p=-;
re(i,,n)
{
for(ch[i]=;ch[i]+<=len[i] && mem[from[i]+ch[i]]!='*';ch[i]++);
if(p==- || ch[p]<ch[i])p=i;
}
re(i,,ch[p])RT[i]=mem[from[p]+i-];
re(i,,n)re(j,,ch[i])if(RT[j]!=mem[from[i]+j-])return ;
p=-;
re(i,,n)
{
for(ch[i]=;ch[i]+<=len[i] && mem[to[i]-ch[i]]!='*';ch[i]++);
if(p==- || ch[p]<ch[i])p=i;
}
re(i,,ch[p])RT[i]=mem[to[p]-i+];
re(i,,n)re(j,,ch[i])if(RT[j]!=mem[to[i]-j+])return ;
}
return ;
} int main()
{
freopen("hs.in","r",stdin);
freopen("hs.out","w",stdout);
int T=gint();
while(T--)
{
read();
PF("%c\n",check()?'Y':'N');
}
return ;
}
bzoj3574[Hnoi2014]抄卡组的更多相关文章
- BZOJ3574 HNOI2014抄卡组(哈希)
容易发现通配符中间的部分可以任意匹配,会造成的无法匹配的仅仅是前后缀,前缀和后缀可以分别独立处理.如果字符串均有通配符,只需要按前/后缀长度排序然后暴力匹配就可以了. 问题在于存在无通配符的字符串.显 ...
- luogu P3234 [HNOI2014]抄卡组
传送门 nmdwsm 自己看吧,不想写了qwq 垃圾代码如下 和题解完全不一样 #define LL long long #define uLL unsigned long long #define ...
- 【LG3234】[HNOI2014]抄卡组
题面 题解 分三种情况: 若所有串都没有通配符,直接哈希比较即可. 若所有串都有通配符, 把无通配符的前缀 和 无通配符的后缀哈希后比较即可. 中间部分由于通配符的存在,一定可以使所有串匹配. 若部分 ...
- [HNOI2014]抄卡组
[Luogu3234] [LOJ2208] 题解及代码 锻炼哈希码力的一道题 , 具体细节见代码 #include<cstdio> #include<cstring> #inc ...
- 洛谷P3234 抄卡组 [HNOI2014] 字符串hash
正解:字符串hash 解题报告: 传送门! 字符串hash是字符串匹配中很常见的一个方法,原理也很好懂,这里就不做太多阐述辣有时间放到hash笔记里面去QAQ 题意不说了挺好理解的,自带一句话概括好评 ...
- 【HNOI2014】抄卡组
题面 题解 如果所有的字符串都有通配符,那么只要比较不含通配符的前缀和后缀就可以了. 否则一定有一个串没有通配符.找出这个字符串,然后将所有串与这个串匹配,通配符将\(B\)分成一段一段在\(A\)上 ...
- 【LOJ6254】最优卡组 堆(模拟搜索)
[LOJ6254]最优卡组 题面 题解:常用的用堆模拟搜索套路(当然也可以二分).先将每个卡包里的卡从大到小排序,然后将所有卡包按(最大值-次大值)从小到大排序,并提前处理掉只有一张卡的卡包. 我们将 ...
- HearthBuddy卡组
偶数萨 手打两天已上传说,各位加油 欧洲牧羊人 ### 火元素换艾雅# 职业:萨满祭司# 模式:狂野模式## 2x (2) 图腾魔像 # 2x (2) 大漩涡传送门 # 2x (2 ...
- 服务器&阵列卡&组raid 5
清除raid信息后,机器将会读不到系统, 后面若进一步操作处理, raid信息有可能会被初始化掉,那么硬盘数据就有可能会被清空, 导致数据丢失, 否则如果只是清除raid信息,重做raid是可以还原系 ...
随机推荐
- iOS开发系列之远程控制事件
在今天的文章中还剩下最后一类事件:远程控制,远程控制事件这里主要说的就是耳机线控操作.在前面的事件列表中,大家可以看到在iOS中和远程控制事件有关的只有一个- (void)remoteControlR ...
- git 取消/添加 某文件的跟踪
如果我们不小心将某个文件加入了 git 版本控制,但是突然又不想继续跟踪控制这个文件了,怎么办呢? 使用 git update-index 即可. 不想继续追踪某个文件 git update-inde ...
- DEDECMS织梦列表页每隔N行文章添加一条分隔线
这是给一个朋友做模板的时候,用到的一个小小的技巧,今天正好用上了,以前看到有人问过不知道解决没有,今天整理了一下,本想保存在自己的电脑里,后来一想,不如咱们一起共享一下,也是对织梦的感恩,有好东西就来 ...
- linq的一些用法总结
获取列表数据. IList<Model> list = dao.getmx(Model, pageInfo);//获取数据列表 1.将列表中id一样的数据进行group by分组,并返回序 ...
- c#将Excel数据导入到数据库的实现代码(OleDb)
sing System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web ...
- SQL 查询的执行过程
所述内容均来自互联网,文章仅作为学习笔记,备忘使用. 有时候我在想我们总是在谈优化,FA 优化结构.优化框架.优化程序…,可是我真的了解将要进行的操作[优化]吗?以最近我的工作-优化SQL为例,我真的 ...
- JQuery中根据属性或属性值获得元素
根据属性获得元素 1.比如要获取页面p标签中属性有id的元素 $("p[id]").css("color","red"); 根据属性值获得元 ...
- 程序里面的system.out.println()输出到其他位置,不输出到tomcat控制台。
设置startup.bat: call "%EXECUTABLE%" run %CMD_LINE_ARGS% >> ..\logs\kongzitai.txt 将sys ...
- 在VMware安装Centos再安装Oracle数据库(个人学习使用)
打开VMware 选择稍后安装 自定义安装 小生安装的是64位的Centos 给虚拟机设置名称和安装位置 设置虚拟机打处理器并分配内存(oracle12G我建议内存为2G以上) 网络类型选择仅主机模式 ...
- 最全CSS3选择器
一,CSS3 选择器分类 二,选择器语法 1,基本选择器语法 选择器 类型 功能描述 * 通配选择器 选择文档中所以HTML元素 E 元素选择器 选择指定类型的HTML元素 #id ID选择器 ...