【2020.12.02提高组模拟】球员(player) 题解

题意描述

基本的递推。

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

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

潜在的球员分成 \(N\) 类,第\(i\)类的球员的姓氏恰好有\(i\)个字母,且每一类恰好有\(K\)个球员。 有多少种不同的方法选出满足要求的$ N $个球员。答案对\(10^9+7\)取余。

Solution

先抛开字符串,思考\(DP\).

用\(f[i][j]\)表示第\(i\)类运动员中的第\(j\)个与其前面的\(i-1\)类运动员有多少种匹配方案。

那么

\[f[i][j]=\sum_{t=1}^{k}[s[i-1][t]是s[i][j]的一部分]f[i-1][t]\\
f[1][j]=1
\]

那么我们需要\(O(nk)\)枚举,再\(O(k)\)枚举上一层,再\(O(n)\)判断两个字符串是否为包含关系,总时间复杂度为\(O(n^2k^2)\)。

优化,用\(哈希\)或者\(AC自动机\)或\(map\)即可,时间复杂度取决于你用什么。

\(trie\)的话貌似会被卡呢(笑)

Code

/*
Name:
Copyright: iee
Author: hsh778205
Date: 02/12/20 10:04
Description: time O(n^2k\log(nk)),memory O(n^2k+?)
*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#define IL inline
#define re register
#define LL long long
#define ULL unsigned long long
#ifdef TH
#define debug printf("Now is %d\n",__LINE__);
#else
#define debug
#endif
using namespace std;
inline int read()
{
int x=0,fu=1;
char ch=getchar();
while(!isdigit(ch)&&ch!='-') ch=getchar();
if(ch=='-') fu=-1,ch=getchar();
x=ch-'0';ch=getchar();
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*fu;
}
int G[55];
template<class T>inline void write(T x)
{
int g=0;
if(x<0) x=-x,putchar('-');
do{G[++g]=x%10;x/=10;}while(x);
for(int i=g;i>=1;--i)putchar('0'+G[i]);putchar('\n');
}
#define p 1000000007
map<string,LL>m;
int n,k,i,j;
LL ans;
string str[51][1510],t1,t2;
int main()
{
// freopen("player.in","r",stdin);
// freopen("player.out","w",stdout);
n=read();
k=read();
for(i=1;i<=n;i++)
{
for(j=1;j<=k;j++)
{
cin>>str[i][j];
}
}
for(i=1;i<=k;i++) m[str[1][i]]++;
for(i=2;i<=n;i++)
{
for(j=1;j<=k;j++)
{
t1=str[i][j].substr(0,str[i][j].size()-1);
t2=str[i][j].substr(1);
if(m.find(t1)!=m.end()) m[str[i][j]]=(m[str[i][j]]+m[t1])%p;
if(t1!=t2) if(m.find(t2)!=m.end()) m[str[i][j]]=(m[str[i][j]]+m[t2])%p;
}
}
for(i=1;i<=k;i++)
{
ans=(ans+m[str[n][i]])%p;
m[str[n][i]]=0;
}
write(ans);
return 0;
}

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

  1. 【2020.12.02提高组模拟】球员(player)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    题目大意 给出一棵 \(n\) 个节点的树,删去其中两条边 使得分出的三个子树大小中最大与最小的差最小 分析 先一边 \(dfs\) 预处理出以 \(1\) 为根每个点的 \(size\) 然后按 \ ...

随机推荐

  1. Java基于XXLJOB的定时任务实现阶梯式通知方式

    数据库表设计 CREATE TABLE `tx_order_push_info` ( `order_no` varchar(64) DEFAULT NULL COMMENT '交易单号', `orde ...

  2. [每日算法 - 华为机试] LeetCode 475. 供暖器

    入口 力扣https://leetcode.cn/problems/heaters/submissions/ 题目描述 冬季已经来临. 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖. 在加热 ...

  3. CSS那些事读书笔记-2

    背景 作为一个后端开发,曾经尝试过学习前端,但是总觉不得要领,照猫画虎,而公司里又有专业的前端开发,工作中几乎接触不到实际的前端任务,所以前端的技能田野一直是一片荒芜.但是笔者深知前端的技能对找工作和 ...

  4. 初识if,if的三种结构

    1.if语句 流程控制语句:通过一语句,来控制程序的执行流程.其中if属于分支结构 2.if语句的第一种格式 . 实操: 3.if的第二种格式 实操: 4.if的第三种格式 实操: 5.注意事项 在i ...

  5. Python 潮流周刊#95:像人类一样使用计算机(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  6. golang的条件编译

    写c/c++或者rust的开发者应该对条件编译不陌生,条件编译顾名思义就是在编译时让代码中的一部分生效或者失效,从而控制编译时的代码执行路径,进而影响编译出来的程序的行为. 这有啥用呢?通常在编写跨平 ...

  7. Service Reliability Management: A Comprehensive Overview

    Service Reliability Management: A Comprehensive Overview Service reliability management is a critica ...

  8. STM32串口缓冲区

    在嵌入式开发中,外设通信(如UART.SPI.I2C)的数据接收常面临两大挑战:不定时.不定量数据的实时处理和高频率数据流下的稳定性保障.传统的轮询方式效率低下,而中断驱动的接收逻辑又容易因处理延迟导 ...

  9. 整合阿里OSS进行文件上传

    3.整合阿里OSS进行文件上传 1).引入spring-cloud-starter-alicloud-oss包 2).在配置文件中配置Key.endpoint 3).自动注入private OSSCl ...

  10. 从源码看 QT 的事件系统及自定义事件

    事件是程序内部或外部触发的动作或状态变化的信号.在 Qt 中,所有事件都是 QEvent 派生类的对象,事件由 QObject 派生类的对象接收和处理.每一个事件都有对应的 QEvent 派生类,当事 ...