题目链接:http://codeforces.com/contest/766/problem/C

题目:

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 thanai. For example, ifa1 = 2 he can't write character 'a' on this paper in a string of length3 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 ben and they shouldn't overlap. For example, ifa1 = 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 use3 magical papers. He can't split it into "aa" and "aa" because the sum of their lengths is greater thann. 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 strings, 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 isn and they don't overlap? Compute the answer modulo109 + 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 lengthn 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 modulo109  +  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

Note

In the first example the three ways to split the message are:

  • a|a|b
  • aa|b
  • a|ab

The longest substrings are "aa" and "ab" of length2.

The minimum number of substrings is 2 in "a|ab" or "aa|b".

Notice that "aab" is not a possible splitting because the letter 'a' appears in a substring of length3, while a1 = 2.

题目大意:

给你一个长度为n的串s,给出每个字母(a~z)能够最长存在长度的字串,有3个问题:

1.有多少种分配方案

2.这些分配方案中最长的一段字串的长度

3.这些分配方案中最少可以把串s分成几份

题目分析;

显然要用动态规划来求解这题

对于问题1,用dp1[k]来表示前k个字符最多分成多少份,如果和前一个字符可以组成一个字符段有状态转移方程,dp1[i]+=dp1[j-1];由于这里是要满足该一小段里面所有字符的约束条件,所以要控制ml=min(ml,v[s[j]-'a']);

对于问题2,只需要在每个符合条件的子段中max即可

对于问题3,用dp2[k]代表前k份能分成的最少份数,初始化dp2[i]=dp2[i-1]+1;(当i-1和i不在同一段),如果前些字符可以与之处于同一字符小段内,则有状态转移方程dp2[i]=min(dp2[i],dp2[j-1]+1);

AC代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define LL long long
const int maxn=1e3+5;
const LL mod=1e9+7;
int n;
char s[maxn];
int v[26];
int dp1[maxn];//dp1[k],前k个最多分成多少份
int dp2[maxn];//dp2[k]代表前k份能分成的最少份数
int mx,ml;
int main()
{while(~scanf("%d",&n)){scanf("%s",s+1);for(int i=0;i<26;i++)scanf("%d",&v[i]);memset(dp1,0,sizeof(dp1));memset(dp2,0,sizeof(dp2));dp1[0]=1;mx=1;for(int i=1;i<=n;i++){dp1[i]=dp1[i-1];dp1[i]%=mod;dp2[i]=dp2[i-1]+1;ml=v[s[i]-'a'];for(int j=i-1;j>=1;j--){ml=min(ml,v[s[j]-'a']);if(i-j+1<=ml){dp1[i]+=dp1[j-1];dp1[i]%=mod;mx=max(i-j+1,mx);dp2[i]=min(dp2[i],dp2[j-1]+1);}elsebreak;}}cout<<dp1[n]<<endl;cout<<mx<<endl;cout<<dp2[n]<<endl;}return 0;
}

codeforces 766 C Mahmoud and a Message相关推荐

  1. CodeForces - 766C - Mahmoud and a Message dp

    题意 给出一个字符串 和每个字符的限制数量ai 让我们随意的切割成多个字符串 使得每一个字符串中的特定字符所在的子串长度len<=ai 求一共有多少个符合题目要求的方案 求其中最长的一个串长度是 ...

  2. 【codeforces 766E】Mahmoud and a xor trip

    [题目链接]:http://codeforces.com/contest/766/problem/E [题意] 定义树上任意两点之间的距离为这条简单路径上经过的点; 那些点上的权值的所有异或; 求任意 ...

  3. 766C - Mahmoud and a Message(dp)

    https://codeforces.com/problemset/problem/766/C 有一个长度为n的字符串,第二行有26个数字,位置1~26对应为a~z的字母,数值表示该字母不能出现在长度 ...

  4. Codeforces 959 E. Mahmoud and Ehab and the xor-MST 思路:找规律题,时间复杂度O(log(n))

    题目: 解题思路 这题就是0,1,2-n-1总共n个数字形成的最小生成树. 我们可以发现,一个数字k与比它小的数字形成的异或值,一定可以取到k与所有正整数形成的异或值的最小值. 要计算n个数字的情况我 ...

  5. Codeforces Round #396(Div. 2)

    Codeforces Round #396 A. Mahmoud and Longest Uncommon Subsequence 题意 给定两串,求最长非公共子串. 非公共子串:A串的某子串sub_ ...

  6. Codeforces Round #396 (Div. 2) E. Mahmoud and a xor trip 二进制拆位+树型dp

    E. Mahmoud and a xor trip 链接: http://codeforces.com/contest/766/problem/E 题意: 给定一颗n节点的树以及每个节点的权值,另di ...

  7. Codeforces 862B - Mahmoud and Ehab and the bipartiteness

    862B - Mahmoud and Ehab and the bipartiteness 思路:先染色,然后找一种颜色dfs遍历每一个点求答案. 代码: #include<bits/stdc+ ...

  8. Codeforces 766E Mahmoud and a xor trip(树形DP)

    题目链接 Mahmoud and a xor trip 树形DP.先考虑每个点到他本身的距离和,再算所有点两两距离和. 做的时候考虑二进制拆位即可. #include <bits/stdc++. ...

  9. D. Mahmoud and Ehab and the binary string Codeforces Round #435 (Div. 2)

    http://codeforces.com/contest/862/problem/D 交互题 fflush(stdout) 调试: 先行给出结果,函数代替输入 1 #include <cstd ...

最新文章

  1. MATLAB中repmat是什么,在NumPy中,MATLAB的repmat是什么?
  2. apache_tomcat整合应用
  3. centos 光盘 mysql_Centos6.5 使用光盘镜像系统源安装数据库mysql5.7
  4. vba和python哪个好学-Python或将取代VBA,成为Excel官方脚本语言???
  5. 企业路由器应用——DMZ口
  6. C++ 虚函数表解析 继承
  7. Recover刷机简介
  8. 小米11 Pro最新渲染图曝光:后置体积巨大的矩阵四摄
  9. HDFS副本放置策略
  10. ubuntu安装有道云笔记_建立基于有道云笔记的错题本
  11. 如果你被领导当众打了一耳光,你会怎么做?
  12. android开发利用传感器实现微信的摇一摇功能(zz)
  13. JavaWeb 简单实现客户信息管理系统
  14. 手把手教你用Execel计算两个矩阵的乘法
  15. CATIA V5汽车焊接夹具设计从基础到高级培训视频教程
  16. 传奇清理服务器信息,传奇行会信息等清除问题
  17. 标准员培训建筑八大员培训建筑标准员建筑工程施工标准化管理
  18. Nginx启动成功但页面访问不到的解决方法
  19. STARK代码详细学习笔记
  20. 无限天空服务器,滚动的天空无限钻石无限金币版

热门文章

  1. [md] 如何做一个心状枕头
  2. 可解释性机器学习:从入门到实战
  3. 【国际】费城联邦储备银行会议探索区块链对金融稳定的影响
  4. 简单ELT ( 内含系统计算器)
  5. Django 快速入门课程「搭建个人博客」
  6. 计算机课程设置图片,《计算机图形图像处理》课程简介
  7. 护理专业有必要考计算机吗,护理专业考研有前途吗
  8. 【04741】2022年10月高等教育自学考试-计算机网络原理
  9. 解决 : ERROR: Could not install packages due to an EnvironmentError: [Errno 2] No such file or directo
  10. SmartRefreshLayout上拉刷新和下拉加载使用心得