题意

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

给定一些字母的价值(如图所示),给出一个字符串(长度在$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. linux命令详解之ls命令

    ls命令概述 ls命令用于显示文件目录列表,和Windows系统下DOS命令dir类似.当执行ls命令时,默认显示的只有非隐藏文件的文件名.以文件名进行排序及文件名代表的颜色显示.当不加参数时,默认列 ...

  2. buuctf@easyre

  3. “==”与equals方法

    “==”操作符 基本类型比较值:判断两个变量的值相等. 引用类型比较引用(是否指向同一个对象):只有指向同一个对象时才相等. 用“==”进行比较时,两边的数据类型必须兼容(可自动转换的基本数据类型除外 ...

  4. viewport的相关知识点

    主要说一些viewport的基本原理以及使用 ㈠概念 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤到很小的 ...

  5. NOI数论姿势瞎总结(Pi也没有)

    Miller-Rabin素数检测 费马小定理:没人不会吧. 二次探测:如果\(n\)是质数,\(x^2 \equiv 1\ (\mod n)\)的解只有\(x \equiv 1\)或\(x \equi ...

  6. JIRA7.13版本创建项目:字段和界面(三)

    这是我从网上找的资料和最新版的相差不大,可以借鉴原文链接:http://ju.outofmemory.cn/entry/367224 项目的版本号取决于修复版本,不是影响版本 字段 我们已经知道如何在 ...

  7. 分布式-信息方式-ActiveMQ基础

    ActiveMQ简介 ActiveMQ是什么ActiveMQ是Apache推出的,一款开源全支持JMS.1和J2EE1.4范的JMS Provider实现的信息中间件.(message oriente ...

  8. TCP层bind系统调用的实现分析

    说明:该文章中部分代码未能完全理解透彻,可能对您造成误解,请慎读: 并建议您先阅读本博另外一篇文章:<Linux TCP套接字选项 之 SO_REUSEADDR && SO_RE ...

  9. Kotlin 的函数定义和使用 (译文 转)

    Kotlin 的函数定义和使用 函数声明Kotlin 中的函数使用 fun 关键字声明 fun double(x: Int): Int {}函数用法调用函数使用传统的方法 val result = d ...

  10. Java内存泄漏分析和预防

    1. 什么是内存泄漏?有什么危害 书面说法: 内存泄漏:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着. 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个 ...