热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CodeforcesRound#396(Div.2)C.MahmoudandaMessage倒着DP

题目链接:这里Mahmoudwroteamessagesoflengthn.HewantstosenditasabirthdaypresenttohisfriendM

题目链接:这里
Mahmoud wrote a message s of length n. He wants to send it as a birthday present to his friend Moaz who likes strings. He wrote it on a magical paper but he was surprised because some characters disappeared while writing the string. That’s because this magical paper doesn’t allow character number i in the English alphabet to be written on it in a string of length more than ai. For example, if a1 = 2 he can’t write character ‘a’ on this paper in a string of length 3 or more. String “aa” is allowed while string “aaa” is not.

Mahmoud decided to split the message into some non-empty substrings so that he can write every substring on an independent magical paper and fulfill the condition. The sum of their lengths should be n and they shouldn’t overlap. For example, if a1 = 2 and he wants to send string “aaa”, he can split it into “a” and “aa” and use 2 magical papers, or into “a”, “a” and “a” and use 3 magical papers. He can’t split it into “aa” and “aa” because the sum of their lengths is greater than n. He can split the message into single string if it fulfills the conditions.

A substring of string s is a string that consists of some consecutive characters from string s, strings “ab”, “abc” and “b” are substrings of string “abc”, while strings “acb” and “ac” are not. Any string is a substring of itself.

While Mahmoud was thinking of how to split the message, Ehab told him that there are many ways to split it. After that Mahmoud asked you three questions:

How many ways are there to split the string into substrings such that every substring fulfills the condition of the magical paper, the sum of their lengths is n and they don't overlap? Compute the answer modulo 109 + 7.
What is the maximum length of a substring that can appear in some valid splitting?
What is the minimum number of substrings the message can be spit in?

Two ways are considered different, if the sets of split positions differ. For example, splitting “aa|a” and “a|aa” are considered different splittings of message “aaa”.
Input

The first line contains an integer n (1 ≤ n ≤ 103) denoting the length of the message.

The second line contains the message s of length n that consists of lowercase English letters.

The third line contains 26 integers a1, a2, …, a26 (1 ≤ ax ≤ 103) — the maximum lengths of substring each letter can appear in.
Output

Print three lines.

In the first line print the number of ways to split the message into substrings and fulfill the conditions mentioned in the problem modulo 109  +  7.

In the second line print the length of the longest substring over all the ways.

In the third line print the minimum number of substrings over all the ways.
Examples
Input

3
aab
2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Output

3
2
2

Input

10
abcdeabcde
5 5 5 5 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Output

401
4
3

题意:

给你一个长度为n的串,然后再给你26个数num[i]。

你现在要分割这个串&#xff0c;合法的分割是&#xff1a;如果某一个分割存在字母i&#xff0c;那么要么满足len<&#61;num[i]才行&#xff0c;就是这个分割的长度应该小于num[i]

然后让你输出&#xff1a;

&#xff08;1&#xff09;分割的方式数量 mod 1e9&#43;7

&#xff08;2&#xff09;合法的分割中&#xff0c;最长的分割长度是多少&#xff1f;

&#xff08;3&#xff09;最少的分割次数是多少&#xff1f;

解法&#xff1a;
设f[i]表示从i开始进行分割的方案数;
f[i] &#43;&#61; ∑f[j];这里min(ma[s[i]..s[j]])>&#61;j-i&#43;1,且j>&#61;i;
ma[x]是x这个字母能够待在的最长的字符串的长度;
然后每次都用j-i&#43;1尝试更新“段”的最大值;
用一个num[i]表示以i作为分割的起点需要分成几段&#xff1b;
num[i]&#61;min(num[i],num[j]&#43;1);
边界:
f[n&#43;1]&#61;1,num[n&#43;1]&#61;0;
逆序更新;
最后输出f[1]就好;

//HDU 4388#include
using namespace std;
const int maxn &#61; 1e3&#43;7;
const long long mod &#61; 1e9&#43;7;
int n, maxseg, a[maxn], ma[maxn], num[maxn];//num[i]表示以i作为分割的起点,需要分成几段,maxseg表示合法的分割中&#xff0c;最长的分割长度是多少
long long dp[maxn]; //dp[i]代表从i开始分割的方案数
char s[maxn];
int main()
{memset(dp, -1, sizeof(dp));memset(num, 0x3f, sizeof(num));scanf("%d", &n);scanf("%s", s&#43;1);for(int i &#61; 1; i <&#61; n; i&#43;&#43;){a[i] &#61; s[i] - &#39;a&#39; &#43; 1;}for(int i &#61; 1; i <&#61; 26; i&#43;&#43;) scanf("%d", &ma[i]);maxseg &#61; 0;dp[n&#43;1] &#61; 1LL, num[n&#43;1] &#61; 0;for(int i &#61; n; i >&#61; 1; i--){int minseg &#61; 1e8;for(int j &#61; i; j <&#61; n; j&#43;&#43;){minseg &#61; min(minseg, ma[a[j]]);int curseg &#61; j - i &#43; 1;//当前段大小if(curseg > minseg) break;if(dp[j&#43;1] !&#61; -1){if(dp[i] &#61;&#61; -1) dp[i] &#61; 0;dp[i] &#61; (dp[i] &#43; dp[j&#43;1]) % mod;num[i] &#61; min(num[i], num[j&#43;1]&#43;1);maxseg &#61; max(maxseg, curseg);}}}cout <1] <cout <cout <1] <return 0;
}


推荐阅读
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • 处理Android EditText中数字输入与parseInt方法
    本文探讨了如何在Android应用中从EditText组件安全地获取并解析用户输入的数字,特别是用于设置端口号的情况。通过示例代码和异常处理策略,展示了有效的方法来避免因非法输入导致的应用崩溃。 ... [详细]
  • 本文通过C++语言实现了一个递归算法,用于解析并计算数学表达式的值。该算法能够处理加法、减法、乘法和除法操作。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • Java 中的十进制样式 getZeroDigit()方法,示例 ... [详细]
  • 本问题涉及在给定的无向图中寻找一个至少包含三个节点的环,该环上的节点不重复,并且环上所有边的长度之和最小。目标是找到并输出这个最小环的具体方案。 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • 字符串中特定模式出现次数的计算方法
    本文详细探讨了如何高效地计算字符串中特定模式(如'pat')的出现次数,通过实例分析与算法解析,帮助读者掌握解决此类问题的方法。 ... [详细]
  • Irish budget airline Ryanair announced plans to significantly increase its route network from Frankfurt Airport, marking a direct challenge to Lufthansa, Germany's leading carrier. ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • 本文将详细介绍如何使用Java编程语言生成指定数量的不重复随机数,包括具体的实现方法和代码示例。适合初学者和有一定基础的开发者参考。 ... [详细]
author-avatar
啊啦哈200601
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有