【2020.12.02提高组模拟】球员(player)
题目
题目描述
老师们已经知道学生喜欢睡觉,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)的更多相关文章
- 【2020.12.02提高组模拟】A组反思
55,rk47 T1 赛时先想了\(trie\),想到不一定是前缀,然后就放弃转为打暴力 得分:\(RE22\) 正解是只用判断\(i\)与\(i+1\)的关系,那么只有两种情况,判断一下然后\(dp ...
- 【2020.12.01提高组模拟】卡特兰数(catalan)
题目 题目描述 今天,接触信息学不久的小\(A\)刚刚学习了卡特兰数. 卡特兰数的一个经典定义是,将\(n\)个数依次入栈,合法的出栈序列个数. 小\(A\)觉得这样的情况太平凡了.于是,他给出了\( ...
- 【2020.12.01提高组模拟】A组反思
105,rk45 T1 赛时一开始先打了\(m=0\)的情况,也就是普通的卡特兰数,然后打了暴力,样例过了,把样例改改就不行了,原因没有保证是枚举的是合法的出栈序列 得分:\(WA\&TLE1 ...
- 【2020.12.03提高组模拟】A组反思
估计:40+10+0+0=50 实际:40+10+0+0=50 rank40 T1 赛时看到\(n,m\leq9\),我当机立断决定打表,暴力打了几个点之后发现在\(n\ne m\)且\(k\ne0\ ...
- 【2020.11.28提高组模拟】T1染色(color)
[2020.11.28提高组模拟]T1染色(color) 题目 题目描述 给定 \(n\),你现在需要给整数 \(1\) 到 \(n\) 进行染色,使得对于所有的 \(1\leq i<j\leq ...
- 【2020.11.28提高组模拟】T2 序列(array)
序列(array) 题目描述 给定一个长为 \(m\) 的序列 \(a\). 有一个长为 \(m\) 的序列 \(b\),需满足 \(0\leq b_i \leq n\),\(\sum_{i=1}^ ...
- 【2020.11.30提高组模拟】剪辣椒(chilli)
剪辣椒(chilli) 题目描述 在花园里劳累了一上午之后,你决定用自己种的干辣椒奖励自己. 你有n个辣椒,这些辣椒用n-1条绳子连接在一起,任意两个辣椒通过用若干个绳子相连,即形成一棵树. 你决定分 ...
- 【2020.11.30提高组模拟】删边(delete)
删边(delete) 题目 题目描述 给你一棵n个结点的树,每个结点有一个权值,删除一条边的费用为该边连接的两个子树中结点权值最大值之和.现要删除树中的所有边,删除边的顺序可以任意设定,请计算出所有方 ...
- JZOJ 5184. 【NOIP2017提高组模拟6.29】Gift
5184. [NOIP2017提高组模拟6.29]Gift (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Detailed ...
随机推荐
- Netcore中简单使用MemoryCache
用到缓存架构,我们一般都会想到的Redis,因为它支持分布式,高可用,速率非常快.MemoryCache则相对较少提到,但是对于单体项目或者小型项目,memorycache还是是不错的选择.Memor ...
- leetcode129valid-parentheses
题目描述 给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列 括号必须以正确的顺序关闭,"()"和"()[] ...
- python爬虫10 b站爬取使用 selenium+ phantomJS
但有时候 我们不想要让它打开浏览器去执行 能不能直接在代码里面运行呢 也就是说 有没有一个无形的浏览器呢 恩 phantomJS 就是 它是一个基于 WebKit 的浏览器引擎 可以做到无声无息的操作 ...
- 记git一些基本用法
git init 在合适的位置建一个文件夹,并在当前目录下右键打开 git Bash,利用git init把这个目录改成git可以管理的仓库 git add 要添加的文件名 ...
- .net core mvc appsettings.json配置文件的使用
配置文件的使用主要是两种用法 1.直接使用弱类型的数据 2.使用强类型的数据 (将配置的数据映射到类) 直接使用弱类型的数据 在appsetings.json文件中先新建两个节点 TestObj节点 ...
- Pytest学习(七) - skip、skipif的使用
前言 作为一个java党,我还是觉得pytest和testng很像,有时候真的会感觉到代码语言在某种程度上是相通的,那么今天来说说这两个知识点. skip和skipif,见名知意,就是跳过测试呗,直白 ...
- mingw32环境下链接库找不到问题
本人在win10下安装了mingw环境,以方面windows下测试gcc编译器构建一些开源组件.但是windows系统下遇到了一些编译问题. 1. 问题现象 一次手写的Makefile遇到了如下编译错 ...
- AHB SRAM控制器设计
- ceph使用memdisk做journal
记得在很久很久以前,ceph当时的版本是有提供使用内存做journal的配置的,当时是使用的tmpfs,但是现在的版本在搜资料的时候,发现关于这个的没怎么找到资料,邮件列表里面有人有提到怎么做,看了下 ...
- centos使用U盘做启动盘
软件下载地址: http://sourceforge.net/projects/iso2usb/files/latest/download?source=dlp 写于: 2014年08月04日 更新于 ...