[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 ...
随机推荐
- Seajs的用法
以前经常听到Seajs,但是没深入了解过,不清楚到底是用做哪个方面,后来调组到M站做开发,发现项目用到了Seajs,便去了解下 SeaJS是一个遵循CMD规范的JavaScript模块加载框架,可以实 ...
- 前缀统计 [Trie]
前缀统计 描述 给定N个字符串S1,S2...SN,接下来进行M次询问,每次询问给定一个字符串T,求S1-SN中有多少个字符串是T的前缀.输入字符串的总长度不超过10^6,仅包含小写字母. 输入格式 ...
- HDU1272:小希的迷宫(并查集)
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- Spring MVC框架下 从后台读取数据库并显示在前台页面【笔记自用 不推荐作为参考】
1.书写jsp页面 people.jsp 1.设计显示格式以及内容显示 2.设计显示内容的范围 2.书写entity实体类 PeopleFormMap.java 书写传入的参数主要包括 要引用的数据 ...
- 【Foreign】旅行路线 [倍增]
旅行路线 Time Limit: 20 Sec Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 3 2 ...
- 【BZOJ】5028: 小Z的加油店
[算法]数学+线段树/树状数组 [题解] 首先三个操作可以理解为更相减损术或者辗转相除法(待证明),所以就是求区间gcd. 这题的问题在线段树维护gcd只能支持修改成一个数,不支持加一个数. 套路:g ...
- DB 基本性能指标
DB: •500K I/O limit with kill(5M I/O limit for DWS) •10,000 return row limit with kill •30 seconds p ...
- sql 批量更新表中多字段为不同的值
,),,),rand()) select newid() ,) update tablename , FB,)) , ), FC,)) , )
- Codeforces 940F Machine Learning 带修改莫队
题目链接 题意 给定一个长度为\(n\)的数组\(a\),\(q\)个操作,操作分两种: 对于区间\([l,r]\),询问\(Mex\{c_0,c_1,c_2,⋯,c_{10^9}\}\),其中\(c ...
- Java相关框架
框架 类型 设计(个人理解) HK2 自动注入框架 Jersey RESTful Jetty HTTP服务 Retrofit HTTP客户端 ActiveMQ 消息组件 主题.队列 Redis K-V ...