题目

题目描述

老师们已经知道学生喜欢睡觉,Soaring是这项记录保持者。他只会在吃饭或玩FIFA20时才会醒来。因此,他经常做关于足球的梦,在他最近的一次梦中,他发现自己成了皇家马德里足球俱乐部的总经理。

他的工作是挑选N名球员争取在下个赛季打败巴塞罗那队,但是董事会有两个特殊的要求。具体如下:

①所有运动员姓氏的长度必须不同。

②每个运动员的姓氏必须是长度比其长的所有其他运动员姓氏的连续子串

为了让工作变得简单,Soaring将潜在的球员分成N类,第i类的球员的姓氏恰好有i个字母,且每一类恰好有K个球员。

Soaring想知道有多少种不同的方法选出满足要求的N个球员。答案对(10^9^+7)取余。

题解

题目大意:有\(n\)种不同长度的字符串,每种字符串有\(k\)个,第\(i\)中字符串的长度是\(i\),现在要从\(n\)种字符串里每种选一个,使得选出的字符串都是所有长度比其长的字符串的连续字串,问有多少种选择方案,对\(10^9+7\)取模

22%

暴力从每种里选择,再暴力判断是否合法

时间复杂度\(O(k^nn^4)\),预计得分22

100%

首先我们知道,若\(a\)是\(b\)的连续字串,\(b\)是\(c\)的连续子串,那么\(a\)一定是\(c\)的连续字串

那么判断时就可以只判断\(i\)和\(i+1\)的关系,而\(i\)与\(i+1\)的长度只相差1,说明想要是连续子串,要么是末尾空一个字母,要么开头空一个字母

考虑\(dp\),设\(f[i][j]\)表示到了第\(i\)种,第\(i\)种选择第\(j\)个的方案数,那么枚举\(u\),若\(u\)是\(j\)的子串,那么转移:\(f[i][j]+=f[i-1][u]\)

答案是\(\sum_{i=1}^kf[n][i]\)

Code

#include<cstdio>
#define ll long long
#define mod 1000000007
#define N 55
#define K 1505
using namespace std;
int n,m;
ll sq,sh,ans,a[N][K][N],f[N][K];
char s[N];
ll mi(int x)
{
ll res=1;
for (int i=1;i<=x;++i)
res=res*26%mod;
return res;
}
int main()
{
freopen("player.in","r",stdin);
freopen("player.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=n;++i)
{
for (int j=1;j<=m;++j)
{
scanf("%s",s+1);
for (int k=1;k<=i;++k)
a[i][j][k]=(a[i][j][k-1]*26%mod+s[k]-'a')%mod;
}
}
for (int i=1;i<=m;++i)
f[1][i]=1;
for (int i=2;i<=n;++i)
for (int j=1;j<=m;++j)
{
sq=a[i][j][i-1];//当前字符串的1~i-1位
sh=(a[i][j][i]-mi(i-1)*a[i][j][1]%mod+mod)%mod;//当前字符串的2~i位
for (int k=1;k<=m;++k)
if (a[i-1][k][i-1]==sq||a[i-1][k][i-1]==sh/*判断是否是连续子串*/) f[i][j]=(f[i][j]+f[i-1][k])%mod;
}
for (int i=1;i<=m;++i)
ans=(ans+f[n][i])%mod;
printf("%lld\n",ans);
fclose(stdin);
fclose(stdout);
return 0;
}

【2020.12.02提高组模拟】球员(player)的更多相关文章

  1. 【2020.12.02提高组模拟】A组反思

    55,rk47 T1 赛时先想了\(trie\),想到不一定是前缀,然后就放弃转为打暴力 得分:\(RE22\) 正解是只用判断\(i\)与\(i+1\)的关系,那么只有两种情况,判断一下然后\(dp ...

  2. 【2020.12.01提高组模拟】卡特兰数(catalan)

    题目 题目描述 今天,接触信息学不久的小\(A\)刚刚学习了卡特兰数. 卡特兰数的一个经典定义是,将\(n\)个数依次入栈,合法的出栈序列个数. 小\(A\)觉得这样的情况太平凡了.于是,他给出了\( ...

  3. 【2020.12.01提高组模拟】A组反思

    105,rk45 T1 赛时一开始先打了\(m=0\)的情况,也就是普通的卡特兰数,然后打了暴力,样例过了,把样例改改就不行了,原因没有保证是枚举的是合法的出栈序列 得分:\(WA\&TLE1 ...

  4. 【2020.12.03提高组模拟】A组反思

    估计:40+10+0+0=50 实际:40+10+0+0=50 rank40 T1 赛时看到\(n,m\leq9\),我当机立断决定打表,暴力打了几个点之后发现在\(n\ne m\)且\(k\ne0\ ...

  5. 【2020.11.28提高组模拟】T1染色(color)

    [2020.11.28提高组模拟]T1染色(color) 题目 题目描述 给定 \(n\),你现在需要给整数 \(1\) 到 \(n\) 进行染色,使得对于所有的 \(1\leq i<j\leq ...

  6. 【2020.11.28提高组模拟】T2 序列(array)

    序列(array) 题目描述 ​给定一个长为 \(m\) 的序列 \(a\). 有一个长为 \(m\) 的序列 \(b\),需满足 \(0\leq b_i \leq n\),\(\sum_{i=1}^ ...

  7. 【2020.11.30提高组模拟】剪辣椒(chilli)

    剪辣椒(chilli) 题目描述 在花园里劳累了一上午之后,你决定用自己种的干辣椒奖励自己. 你有n个辣椒,这些辣椒用n-1条绳子连接在一起,任意两个辣椒通过用若干个绳子相连,即形成一棵树. 你决定分 ...

  8. 【2020.11.30提高组模拟】删边(delete)

    删边(delete) 题目 题目描述 给你一棵n个结点的树,每个结点有一个权值,删除一条边的费用为该边连接的两个子树中结点权值最大值之和.现要删除树中的所有边,删除边的顺序可以任意设定,请计算出所有方 ...

  9. JZOJ 5184. 【NOIP2017提高组模拟6.29】Gift

    5184. [NOIP2017提高组模拟6.29]Gift (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed ...

随机推荐

  1. 300万运算/秒 :VoltDB在电信行业基准测试上可线性扩展性能

    01 总 体 概 述 VoltDB受到全球电信软件解决方案提供商的信赖,后者将其作为首选内存数据库来驱动他们部署在全球100多家运营商处的任务关键型应用.VoltDB受到青睐的原因在于其性能和功能不仅 ...

  2. Python3网络学习案例二:traceroute详解

    1. 写在前面 本文是基于上一篇"ping详解"写的: 不同操作系统下的命令也不同,本文仅针对windows系统,命令为"tracert xxx",效果如下 2 ...

  3. C#4语法新特性

    C#4,.NET Framework 4.0, Visual Studio 2010  C#4.0新引进的语法基于.Net Framework 4.0.主要引进的语法:动态类型,命名参数.可选参数,优 ...

  4. 3.1 spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖

    本次博客的目标 1. 手写spring循环依赖的整个过程 2. spring怎么解决循环依赖 3. 为什么要二级缓存和三级缓存 4. spring有没有解决构造函数的循环依赖 5. spring有没有 ...

  5. C中二叉排序树的非递归和递归插入操作以及中序遍历代码实现【可运行】

    C中二叉排序树的非递归和递归插入操作以及中序遍历代码实现[可运行] #include <stdio.h> #include <stdlib.h> typedef int Key ...

  6. Visual Studio空格变成点的快捷键切换

    [Ctrl + R + W] 效果如下图

  7. 幻读在 InnoDB 中是被如何解决的?(转)

    在MySQL事务初识中,我们了解到不同的事务隔离级别会引发不同的问题,如在 RR 级别下会出现幻读.但如果将存储引擎选为 InnoDB ,在 RR 级别下,幻读的问题就会被解决.在这篇文章中,会先介绍 ...

  8. 快速熟悉 Oracle AWR 报告解读

    目录 AWR报告简介 AWR报告结构 基本信息 Report Summary Main Report RAC statistics Wait Event Statistics 参考资料 本文面向没有太 ...

  9. 多MDS变成单MDS的方法

    前言 之前有个cepher的环境上是双活MDS的,需要变成MDS,目前最新版本是支持这个操作的 方法 设置最大mds 多活的mds的max_mds会超过1,这里需要先将max_mds设置为1 ceph ...

  10. ubuntu配置bonding

    如果节点上有多个网络接口时可以通过bonding将多个网络接口虚拟为一个网络接口,bonding可以提供高可用及负载均衡功能,从而提高节点的网络接口性能及可用性. 配置单bond 一.使用如下命令安装 ...