题意

这道题的题目描述让我好一阵蒙,简述一下题意吧:

给定一些字母的价值(如图所示),给出一个字符串(长度在$3$到$7$之间,可以出现重复的字母)和一个单词库。定义一个单词的价值就是它的字母的价值之和,一组单词的价值就是所有单词的价值之和,一组单词中的单词数量$>=1$,一组单词中的单词可以重复。要求用字符串中的字母拼成单词库中的一组单词,字符串中的字母不可以重复使用(如果字符串中有多个相同的字母,那么这个字母只能用出现的那么多次),求能够得到的单词组的最大价值并输出所有方案(按字典序)

分析

发现字符串的长度在$3$到$7$之间,单词的长度也在长度在$3$到$7$之间,说明一组单词最多有$2$个。

给出的词库大小是$40000$,但是字符串的只在$3$到$7$之间,也就是最多只有$7$种字母,所以有大量的单词实际上是不合法的,我们可以在输入的时候把它们去掉,只保存有用的单词。

更新一组里面只有一个单词的答案,然后两两枚举单词(一组),更新答案。

利用题目给出的单词库本身按字典序排的性质,有序地遍历就可以保证顺序(良心题目)

 /*
ID: Starry21
LANG: C++
TASK: lgame
*/
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
const int v[]={,,,,,,,,,,,,,,,,,,,,,,,,,};
char s[];
int cnt[],c1[][],c2[];
char dic[][];
int len[],val[];
int n;
int ans[][];
int num,maxx=;
void get(int i,int j)
{
int res=val[i]+val[j];
if(res<maxx) return ;
if(res>maxx)
{
maxx=res;
num=;//找到了更大的答案 重新来过
//ans[++num][0]=i,ans[num][1]=j;会在下面一个if里再算一次答案
}
if(res==maxx)
ans[++num][]=i,ans[num][]=j;
return ;
}
int main()
{
//freopen("lgame.in","r",stdin);
scanf("%s",s+);
for(int i=;i<=strlen(s+);i++)
cnt[s[i]-'a']++;
//freopen("lgame.dict","r",stdin);
//freopen("lgame.out","w",stdout);
while(scanf("%s",s+)!=EOF)
{
if(s[]=='.') break;
n++;
memcpy(c1[n],cnt,sizeof(cnt));
int tmp=;
bool f=;
for(int i=;i<=strlen(s+);i++)
{
c1[n][s[i]-'a']--;
if(c1[n][s[i]-'a']<)
{
f=;
n--;
break;
}
tmp+=v[s[i]-'a'];
}
if(f) continue;
strcpy(dic[n]+,s+);
//puts(dic[n]+1);
val[n]=tmp;
len[n]=strlen(s+); }//printf("%d\n",n);
for(int i=;i<=n;i++)
{
//puts(dic[i]+1);
get(i,);
for(int j=i+;j<=n;j++)//字典序 1~i-1 get(j,i)不能保证第一个小
{
bool f=;
memcpy(c2,c1[i],sizeof(c1[i]));
for(int k=;k<=len[j];k++)
{
c2[dic[j][k]-'a']--;
if(c2[dic[j][k]-'a']<)
{
f=;
break;
}
}
if(f) continue;
get(i,j);//字典序
}
}
printf("%d\n",maxx);
for(int i=;i<=num;i++)
{
printf("%s",dic[ans[i][]]+);
if(ans[i][]) printf(" %s",dic[ans[i][]]+);
puts("");
}
return ;
}
/*
prmgroa
profile
program
prom
rag
ram
rom
.
*/

Code

USACO4.3 Letter Game【枚举·细节】的更多相关文章

  1. java枚举细节

     1.在没有枚举之前,我们如果需要一些常量,比如说,我们想用一些常量来代替订单的几种状态,如已下单未付款.已付款未发货.已发货未确认收货.已收货未评价.已评价.我们会定义一个用来装常量的类,比如: p ...

  2. C#简单的枚举及结构

    using System; namespace program { enum WeekDays { a, b, c = ,//11 赋值以后就变成11,不赋值就是2 d, e, f, g }//不能输 ...

  3. 洛谷 P1119 灾后重建(Floyd)

    嗯... 题目链接:https://www.luogu.org/problem/P1119 这道题是一个Floyd的很好的题目,在Floyd的基础上加一点优化: 中转点k在这里不能暴力枚举,否则会超时 ...

  4. [bzoj1924]P2403 [SDOI2010]所驼门王的宝藏

    tarjan+DAG 上的 dp 难点在于建图和连边,其实也不难,就是细节挺恶心 我和正解对拍拍出来 3 个错误... 传送门:luogu bzoj 题目描述 有座宫殿呈矩阵状,由 \(R\times ...

  5. 【转】结构struct 联合Union和枚举Enum的细节讨论

    结构struct 联合Union和枚举Enum的细节讨论 联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换 ...

  6. Codeforces Round #116 (Div. 2, ACM-ICPC Rules) Letter(DP 枚举)

    Letter time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  7. Java语法细节 - 内存和枚举

    目录 Java申请DirectBuffer ByteBuffer的position,limit,capacity,flip操作之间的关系 枚举实现单例模式 Java申请DirectBuffer /*- ...

  8. 结构struct 联合Union和枚举Enum的细节讨论

    联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换.联合体对象在同一时间只能存储一个成员的值.联合的内存大小 ...

  9. 【C/C++】C和C++11之enum枚举的使用细节

    作者:李春港 出处:https://www.cnblogs.com/lcgbk/p/14101271.html 目录 一.前言 二.C中的枚举(enum) 2.1 C中枚举的大小 2.2 C中枚举的取 ...

随机推荐

  1. 【The 13th Chinese Northeast Collegiate Programming Contest E题】

    题目大意:给定一棵 N 个点的树,边有边权,定义"线树"为一个图,其中图的顶点是原树中的边,原树中两条有公共端点的边对应在线图中存在一条边,边权为树中两条边的边权和,求线图的最小生 ...

  2. 提取包含QQ的文本为QQ邮箱

    # -*- coding: utf-8 -*- """ Created on Sun Dec 15 14:08:03 2019 @author: Dell 提取包含QQ号 ...

  3. 基于tornado python pandas和bootstrap上传组件的mongodb数据添加工具

    总体思路:基于bootstrap4的前端页面上传组件,把excel文件上传至服务器,并利用python pandas读取里面的数据形成字典列表 通过pymongo 接口把数据插入或追加到mongodb ...

  4. Acwing-99-激光炸弹(二维前缀和)

    链接: https://www.acwing.com/problem/content/101/ 题意: 一种新型的激光炸弹,可以摧毁一个边长为 R 的正方形内的所有的目标. 现在地图上有 N 个目标, ...

  5. centos7安装android studio遇到Unable to run mksdcard sdk tool

    centos系统为最小化安装,所以安装新软件时缺少许多依赖包,Android Studio下载的mksdcard是32位的,而系统是64位的,所以需要安装支持32位软件的依赖包. sudo yum i ...

  6. Java三大体系JavaEE、JavaSE、JavaME的区别

    Java由四方面组成: ●Java编程语言,即语法. ●Java文件格式,即各种文件夹.文件的后缀. ●Java虚拟机(JVM),即处理*.class文件的解释器. ●Java应用程序接口(Java ...

  7. 小程序上传wx.uploadFile - 小程序请假-请求

    小程序上传wx.uploadFile UploadTask wx.uploadFile(Object object) 将本地资源上传到服务器.客户端发起一个 HTTPS POST 请求,其中 cont ...

  8. Spring Boot教程(二十七)整合Spring Security

    在这一节,我们将对/hello页面进行权限控制,必须是授权用户才能访问.当没有权限的用户访问后,跳转到登录页面. 添加依赖 在pom.xml中添加如下配置,引入对Spring Security的依赖. ...

  9. 小程序踩坑之获取不到e.target.dataset的值

    在页面与js传值中我们经常用到data-id="1"的方式,然后通过e.target.dataset.id取id的值今天在获取值时怎么也取不到,后来发现e对象有currentTar ...

  10. go.js-拖拽流程图插件

    1.去除水印 在文件中搜索7eba17a4ca3b1a8346,找到类似a.Jv=d[w.Jg("7eba17a4ca3b1a8346")][w.Jg("78a118b7 ...