luogu P2462 [SDOI2007]游戏
LINK:SDOI2007游戏
题意:接龙前一个要比后面大1 且后一个单词出现的各自字母的次数>=前一个单词各自的字母的次数
考虑暴力dp sort之后dpY 显然会T.
考虑我们没必要枚举j 我们知道后面的要找到前面的一个决策可以通过删掉一个字母来实现 由于删掉最多26个字母我们暴力枚举26种情况。
字符串hash快速查找即可。建议开map查 多一个小log...
窝是看标签有虚树才写这道题的 结果和虚树没什么关系。。
至于怎么hash 对每个len进行hash这样的话不容易冲突 hash随便想一个法则hash就行了 求稳的话就双hash吧。开链表hash也行
写着有点烦了 逻辑很混乱 说好不采用通常字符串hash的 虽然没用但是复杂度更高 考试的时候还是建议前后缀hash 然后逐位判断 顺便上双hash + 链表防止冲突。
我随便写了一个hash方法。。map开的也是醉了。。
当然要注意的一点是 输入问题 字符串不知道有多少行的输入 可以~scanf 来这样写好像是没读到会返回-1 但是普通时候好像会返回0 总之记住即可,字符串的时候要这样写。
const int MAXN=10010;
int n,ans,pos;
int pre[MAXN];
struct wy
{
int len,id;
int c[26];
}t[MAXN];
char a[MAXN][110];
inline int cmp(wy a,wy b){return a.len<b.len;}
map<int,pii>H[110];
inline void get_path(int x)
{
if(!x)return;
get_path(pre[x]);
printf("%s\n",a[t[x].id]+1);
}
int main()
{
freopen("1.in","r",stdin);
while(~scanf("%s",a[++n]+1))
{
t[n].len=strlen(a[n]+1);t[n].id=n;
rep(1,t[n].len,j)++t[n].c[a[n][j]-'a'];
}
--n;
sort(t+1,t+1+n,cmp);
rep(1,n,i)
{
ll ha=0,mx=0,ha1=0;
rep(0,25,j)
{
ha1=(ha1*P+(j+1)*t[i].c[j])%mod;
if(!t[i].c[j])continue;
--t[i].c[j];ha=0;
rep(0,25,k)ha=(ha*P+(k+1)*t[i].c[k])%mod;
if(H[t[i].len-1].find(ha)!=H[t[i].len-1].end())
{
pii w=H[t[i].len-1][ha];
if(w.F>mx)mx=w.F,pre[i]=w.S;
}
++t[i].c[j];
}
++mx;H[t[i].len][ha1]=mk(mx,i);
if(mx>ans)ans=mx,pos=i;
}
put(ans);
get_path(pos);
return 0;
}
luogu P2462 [SDOI2007]游戏的更多相关文章
- 洛谷P2462 [SDOI2007]游戏(哈希+最长路)
题面 传送门 题解 我们把字符的出现次数哈希起来,然后把每个点向能在它之后的点连边.那么这显然是一个\(DAG\),直接求最长路就行了 //minamoto #include<bits/stdc ...
- [luogu]P1070 道路游戏[DP]
[luogu]P1070 道路游戏 题目描述小新正在玩一个简单的电脑游戏.游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针 ...
- [Luogu P3825] [NOI2017] 游戏 (2-SAT)
[Luogu P3825] [NOI2017] 游戏 (2-SAT) 题面 题面较长,略 分析 看到这些约束,应该想到这是类似2-SAT的问题.但是x地图很麻烦,因为k-SAT问题在k>2的时候 ...
- Luogu P4705 玩游戏
题目描述 Alice 和 Bob 又在玩游戏. 对于一次游戏,首先 Alice 获得一个长度为 的序列 ,Bob 获得一个长度为 的序列 bb.之后他们各从自己的序列里随机取出一个数,分别设 ...
- luogu P2123 皇后游戏
传送门 跟国王游戏一样的分析 考虑相邻的两个大臣,设他们前面的\(\sum a_j\)为\(s\),同时注意到后面人的贡献更大 所以\(i\)在前面时,\(c_j=\max(\max(c_{last} ...
- Luogu 1764 翻转游戏 - 枚举 + 搜索
题目描述 kkke在一个n*n的棋盘上进行一个翻转游戏.棋盘的每个格子上都放有一个棋子,每个棋子有2个面,一面是黑色的,另一面是白色的.初始的时候,棋盘上的棋子有的黑色向上,有的白色向上.现在kkke ...
- [题目] Luogu P1312 Mayan游戏
题面 题目描述 $ Mayan puzzle $是最近流行起来的一个游戏.游戏界面是一个 \(7行 \times 5列\)的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放 ...
- Luogu 1070 道路游戏
看完题面想了一会发现只会写$n^3$,愣了一会才想出了单调队列优化的做法. 90分算法: 设$f_{i, j, k}$表示第$i$分钟在第$j$座城市已经走了$k$步的最大价值,转移显然,时间复杂度$ ...
- 【luogu P1558 色板游戏】 题解
题目链接:https://www.luogu.org/problemnew/show/P1558 我知道三十棵线段树很暴力,可是我们可以状压啊. 颜色最多30,不会爆int 另外 吐槽评测机 #inc ...
随机推荐
- MySQL Error (Always Continue)
MySQL Error (Always Continue) 其实大部分error在网上都有对应的解决办法,尤其是对Mysql这种使用范围很广的技术.自己就不为每个error单独发布博客了,仅在这里 ...
- Linux系统安装JDK8
一.卸载现用的JDK 1.查看Linux自带的JDK是否已安装 查看是否安装openjdk,java -version (yum安装的 一般都是 OpenJDK 命令:yum install ...
- springmvc返回接口中long型,页面接收时值却变了
Java序列化JSON时long型数值不准确 现象 项目中用到了唯一ID生成器.生成出的ID时long型的(比如说4616189619433466044).通过某个rest接口中返回json数据后,发 ...
- 深入理解JVM(③)学习Java的内存模型
前言 Java内存模型(Java Memory Model)用来屏蔽各种硬件和操作系统的内存访问差异,这使得Java能够变得非常灵活而不用考虑各系统间的兼容性等问题.定义Java内存模型并非一件容易的 ...
- shells学习
shells 脚本 Shell是在Linux内核与用户之间的解释器程序,通常指的是bash,负责向内核翻译及传达用户/程序指令 是liunx系统中的翻译管,解释器类型: ~]#cat /etc/she ...
- 【Linux】Linux常用命令及操作 (一)
一.Linux简介 二.Linux基础命令 三.工作常用命令 --------------------------------------------------------------------- ...
- JVM 专题一:虚拟机(一)
1. 虚拟机 1.1 什么是虚拟机? 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统. 所谓虚拟机,就是一台虚拟的计算机.它是 ...
- shell专题(九):函数
9.1 系统函数 1.basename基本语法 basename [string / pathname] [suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字 ...
- 有效提高java编程安全性的12条黄金法则
安全性是软件开发中最复杂,最广泛和最重要的考量之一.Java是具有许多内置安全性功能的开发平台,java在长期的发展过程中,已经经过了很多高强度的安全测试,并经常更新安全漏洞.并且Java生态系统还包 ...
- Crawlab Lite 正式发布,更轻量的爬虫管理平台
Crawlab 是一款基于 Golang 的分布式爬虫管理平台,产品发布已经一年有余,经过开发团队的不断打磨,即将迭代到 v0.5 版本.在这期间我们为 Crawlab 加入了大量社区用户共同期望的功 ...