[BZOJ 4060] Word Equations
Link:
Solution:
可以发现字符串间的关系可以构成一棵树
于是我们先用字符串哈希建树,再树形$dp$即可
设$dp[i][j]$为第$i$个节点从$P$字符串的第$j$为开始匹配的失配位置,
则有$dp[i][j]=dp[ch[i][1]][dp[ch[i][0]][j]]$
在叶子节点时暴力匹配就行了,复杂度$O(k*P)$
Code:
#include <bits/stdc++.h> using namespace std; const int MAXN=,ML=;
int T,n,hs[MAXN],dp[MAXN][ML],ch[MAXN][],root;
char S[ML],P[ML],dat[MAXN][ML],tmp[ML],a[ML]; inline int hash(char t[])
{
int ret=;
for(int i=;i<;i++)
ret=ret*+((i<strlen(t))?(t[i]-'A'+):);
return ret;
} int dfs(int x,int y)
{
if(dp[x][y]!=-) return dp[x][y];
if(ch[x][]) return dp[x][y]=dfs(ch[x][],dfs(ch[x][],y));
int k=y;
for(int cur=;k<strlen(P) && cur<strlen(dat[x]);cur++)
if(dat[x][cur]==P[k]) k++;
return dp[x][y]=k;
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);memset(dp,-,sizeof(dp));
for(int i=;i<=n;i++)
{
scanf("%s%s%s",a,tmp,dat[i]);hs[i]=hash(a);
if(dat[i][]>='a' && dat[i][]<='z') ch[i][]=ch[i][]=;
else
{
ch[i][]=hash(dat[i]);
scanf("%s%s",tmp,dat[i]);
ch[i][]=hash(dat[i]);
}
} for(int i=;i<=n;i++) if(ch[i][])
for(int j=;j<;j++) for(int k=;k<=n;k++)
if(ch[i][j]==hs[k]) ch[i][j]=k;
scanf("%s%s",S,P);
for(int i=;i<=n;i++) if(hs[i]==hash(S)) root=i; printf((dfs(root,)<strlen(P))?"NO\n":"YES\n");
}
return ;
}
Review:
如要对字符数组大量比较+判等于,最好使用字符串$Hash$ (采用27进制)
如果不考虑$string$输入效率较低,则对$string$用$map$或$hash\_ map$更优
[BZOJ 4060] Word Equations的更多相关文章
- BZOJ4060 : [Cerc2012]Word equations
首先通过hash建树 设f[i][j]表示第i个特殊符号从P的第j位开始匹配能到达哪里 记忆化搜索,对于底层贪心匹配. #include<cstdio> #include<cstri ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 要back的题目 先立一个flag
要back的题目 目标是全绿!back一题删一题! acmm7 1003 1004 acmm8 1003 1004 sysu20181013 Stat Origin Title Solved A Gy ...
- BZOJ 1622: [Usaco2008 Open]Word Power 名字的能量
题目 1622: [Usaco2008 Open]Word Power 名字的能量 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 349 Solved ...
- 【BZOJ】1622: [Usaco2008 Open]Word Power 名字的能量(dp/-模拟)
http://www.lydsy.com/JudgeOnline/problem.php?id=1622 这题我搜的题解是dp,我也觉得是dp,但是好像比模拟慢啊!!!! 1400ms不科学! 设f[ ...
- BZOJ——1622: [Usaco2008 Open]Word Power 名字的能量
http://www.lydsy.com/JudgeOnline/problem.php?id=1622 Description 约翰想要计算他那N(1≤N≤1000)只奶牛的名字的能量.每只 ...
- bzoj 1622: [Usaco2008 Open]Word Power 名字的能量【模拟】
模拟即可,注意包含可以是不连续的 方便起见读入的时候全转成小写 #include<iostream> #include<cstdio> using namespace std; ...
- 怎样将word文件转化为Latex文件:word-to-latex-2.56具体解释
首先推荐大家读一读这篇博文:http://blog.csdn.net/ibingow/article/details/8613556 --------------------------------- ...
- [BZOJ]1071 组队(SCOI2007)
一道比较NB的套路题. Description NBA每年都有球员选秀环节.通常用速度和身高两项数据来衡量一个篮球运动员的基本素质.假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为mi ...
随机推荐
- 【CF edu 30 C. Strange Game On Matrix】
time limit per test 1 second memory limit per test 256 megabytes input standard input output standa ...
- 桥接物理网卡,pipwork指定ip,外网连接,研究salt+docker
1.桥接物理网卡: 首先下载工具: yum -y install --enablerepo=epel bridge-utils 停止服务: 983 systemctl stop docker 删除do ...
- PRINT_TABLE 列以行形式显示
在sqlplus,如果列比较多,往往会显示不够清晰,这时如果能把查询语句行转列就明了多了,在网上看到print_table存储过程:里面所设置的日期格式,可根据自己习惯修改 CREATE OR REP ...
- tomcat部署多个项目,通过域名解析访问不同的网站
转摘自:http://qinyinbolan.blog.51cto.com/4359507/1211064 说明: 1.首先需要有多个域名,同时指向一个IP地址. 例如:域名:www.bbb.com, ...
- SQL性能分析
MySQL常见瓶颈: CPU:CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据的时候. IO:磁盘I/O瓶颈发生在装入数据远大于内存容量的时候. 服务器硬件的性能瓶颈:top.free.io ...
- 查看jar包源码
1.Maven项目 如下图设置后,它会自动下载源文件,这样就能看到了 2.传统Java项目 2.1.安装 Jad 下载 Jad :http://varaneckas.com/jad/ 解压到任意目录即 ...
- Kali 1.0 / 2.0 安装中文输入法(谷歌pinyin + 其他)
1.kali默认是没有中午输入法的,需要自己安装一下 2.首先我们先获取root权限 dnt@HackerKali:~$ su密码: 3.安装中文输入法(apt-get 指令不会的同学可以学习一下基础 ...
- linux下面which whereis find locate的使用
我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索.这些是从网上找到的资料,因为有时很长时间不会用到,当要用的时候经常弄混了,所以放到这里方便使用. which ...
- Swift “ambiguous use of operator '>'”
http://stackoverflow.com/questions/25458548/swift-ambiguous-use-of-operator 3down votefavorite I h ...
- Make recursive
folder structure: Makefile t1/Makefile t1/t1.c t2/Makefile t2/t2.c Makefile SUBDIRS = t1 t2 all: for ...