[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 ...
随机推荐
- 谈一谈深度学习之semantic Segmentation
上一次发博客已经是9月份的事了....这段时间公司的事实在是多,有写博客的时间都拿去看paper了..正好春节回来写点东西,也正好对这段时间做一个总结. 首先当然还是好好说点这段时间的主要工作:语义分 ...
- Codeforces Round #350 (Div. 2) B
B. Game of Robots time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- 买卖股票的最佳时机 [ leetcode ]
原题地址:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/description/ 给定一个数组,它的第 i 个 ...
- oracle获取主机服务器IP
--要获取服务器端的IP :: SYS@XXX> select utl_inaddr.get_host_address from dual; GET_HOST_ADDRESS --------- ...
- php getimagesize()函数获取图片宽度高度
//php自带函数 getimagesize() $img_info = getimagesize('tomener.jpg'); echo '<pre>'; print_r($img_i ...
- 关于IE6的一些总结
开篇之前,循例简单说说IE6的一些背景吧. IE6是指微软浏览器系列中的第六个版本,它是在2001年的时候伴随着XP系统的问世而同时推出的一款浏览器.因为XP普及的原因,这款浏览器一度问鼎全球浏览器市 ...
- Linux 工作站安全加固规范
目标受众 这是一套 Linux 基金会为其系统管理员提供的推荐规范. 这个文档用于帮助那些使用 Linux 工作站来访问和管理项目的 IT 设施的系统管理员团队. 如果你的系统管理员是远程员工,你也许 ...
- Ubuntu Touch环境搭建
最近搞了一下Nexus 5的MultiRom Manger,体验了一把Ubuntu Touch和Android L,总体感觉还不错,不过Android L的NFC驱动还有问题,Ubuntu Touch ...
- linux下面某些常用命令的用法【转】
转自:http://blog.csdn.net/luo3532869/article/details/7584290 ls 命令用于常看目录,用法:ls [选项][目录或文件]例:使用ls命令显示/h ...
- JSOI2016酱油记
高一,第一次参加NOIP. 后悔初中没有报过名...唉,后悔也来不及了. 不知道自己一个暑假干了什么...算法没学多少,脑子倒是越来越不好使了. 过了初赛,数周后一脸茫(meng)然(bi)地去考场. ...