[ABC268G] Random Student ID
Problem Statement
Takahashi Elementary School has $N$ new students. For $i = 1, 2, \ldots, N$, the name of the $i$-th new student is $S_i$ (which is a string consisting of lowercase English letters).
The names of the $N$ new students are distinct.
The $N$ students will be assigned a student ID $1, 2, 3, \ldots, N$ in ascending lexicographical order of their names. However, instead of the ordinary order of lowercase English letters where a is the minimum and z is the maximum, we use the following order:
- First, Principal Takahashi chooses a string $P$ from the $26!$ permutations of the string
abcdefghijklmnopqrstuvwxyzof length $26$, uniformly at random. - The lowercase English characters that occur earlier in $P$ are considered smaller.
For each of the $N$ students, find the expected value, modulo $998244353$, of the student ID assigned (see Notes).
What is the lexicographical order?
A string $S = S_1S_2\ldots S_{|S|}$ is said to be lexicographically smaller than a string $T = T_1T_2\ldots T_{|T|}$ if one of the following 1. and 2. holds.
Here, $|S|$ and $|T|$ denote the lengths of $S$ and $T$, respectively.
- $|S| \lt |T|$ and $S_1S_2\ldots S_{|S|} = T_1T_2\ldots T_{|S|}$.
- There exists an integer $1 \leq i \leq \min\lbrace |S|, |T| \rbrace$ satisfying the following two conditions:
- $S_1S_2\ldots S_{i-1} = T_1T_2\ldots T_{i-1}$
- $S_i$ is a smaller character than $T_i$.
Notes
We can prove that the sought expected value is always a rational number. Moreover, under the Constraints of this problem, when the value is represented as $\frac{P}{Q}$ by two coprime integers $P$ and $Q$, we can prove that there is a unique integer $R$ such that $R \times Q \equiv P\pmod{998244353}$ and $0 \leq R \lt 998244353$. Find such $R$.
Constraints
- $2 \leq N$
- $N$ is an integer.
- $S_i$ is a string of length at least $1$ consisting of lowercase English letters.
- The sum of lengths of the given strings is at most $5 \times 10^5$.
- $i \neq j \Rightarrow S_i \neq S_j$
Input
Input is given from Standard Input in the following format:
$N$
$S_1$
$S_2$
$\vdots$
$S_N$
Output
Print $N$ lines.
For each $i = 1, 2, \ldots, N$, the $i$-th line should contain the expected value, modulo $998244353$, of the student ID assigned to Student $i$.
Sample Input 1
3
a
aa
ab
Sample Output 1
1
499122179
499122179
The expected value of the student ID assigned to Student $1$ is $1$; the expected values of the student ID assigned to Student $2$ and $3$ are $\frac{5}{2}$.
Note that the answer should be printed modulo $998244353$.
For example, the sought expected value for Student $2$ and $3$ is $\frac{5}{2}$,
and we have $2 \times 499122179 \equiv 5\pmod{998244353}$,
so $499122179$ should be printed.
Sample Input 2
3
a
aa
aaa
Sample Output 2
1
2
3
期望有线性法则。
和的期望等于期望的和。这里要求排名,而每次有一个比他小ID,对排名的贡献是1.最后要求贡献之和的期望,也可以拆成若干个期望之和。
考虑在trie树上弄,那么一个单词的末尾节点 \(x\),如果他的祖先也为单词节点,那么这个节点的字典序一定比他小,算入最终排名。如果以这个节点为根的子树有单词节点,那么这些单词字典序一定比他大。其他的单词超过这个单词的概率为 \(\frac 12\),对排名贡献的期望也是 \(\frac 12\),统计即可。
#include<bits/stdc++.h>
const int N=5e5+5,P=998244353,inv2=P+1>>1;
int n,tr[N][26],idx,sz[N],tag[N],ans[N],cnt=1;
char s[N];
void insert(char s[],int i)
{
int len=strlen(s+1),u=0;
for(int i=1;i<=len;i++)
{
if(!tr[u][s[i]-'a'])
tr[u][s[i]-'a']=++idx;
u=tr[u][s[i]-'a'];
sz[u]++;
}
tag[u]=i;
}
void dfs(int x)
{
if(tag[x])
{
(ans[tag[x]]=1LL*inv2*(n-sz[x]-cnt+1)%P+cnt)%=P;
++cnt;
}
for(int i=0;i<26;i++)
if(tr[x][i])
dfs(tr[x][i]);
if(tag[x])
--cnt;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
insert(s,i);
}
dfs(0);
for(int i=1;i<=n;i++)
printf("%d\n",ans[i]);
}
[ABC268G] Random Student ID的更多相关文章
- mysql删除重复记录,保存Id最小的一条
方法1:1.创建一个临时表,选取需要的数据.2.清空原表.3.临时表数据导入到原表.4.删除临时表.mysql> select * from student;+----+------+| ID ...
- id生成策略 id工具类
import java.util.Random; /** * 各种id生成策略 * <p>Title: IDUtils</p> * <p>Description: ...
- IPv6 tutorial – Part 7: Zone ID and unique local IPv6 unicast addresses
The zone ID is used to distinguish ambiguous link-local and site-local addresses. Unique local IPv6 ...
- oracle创建表(并且实现ID自增)
CREATE TABLE STUDENT ( ID INT NOT NULL, NAME VARCHAR2(4000) NOT NULL, PRIMARY KEY(ID) ) TABLESPACE M ...
- (转载)在mysql中,column 'id' in field list is ambiguous
(转载)http://blog.chinaunix.net/uid-20665047-id-3137284.html column 'id' in field list is ambiguous 这个 ...
- OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法
一. 分类-Category 1. 基本用途:Category 分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...
- 针对Student表的DAO设计实例
完整代码以及junit,mysql--connector包下载地址 : https://github.com/CasterWx/MyStudentDao 表信息: 代码: dao包----impl包- ...
- Spring RPC 入门学习(3)-插入Student对象
Spring RPC 向后台传递对象 1. 新建RPC接口:StudentInterface.java package com.cvicse.ump.rpc.interfaceDefine; impo ...
- id生成工具类
import java.util.Random; /** * 各种id生成策略 * <p>Title: IDUtils</p> * <p>Description: ...
- oracle中实现自增id
在一些数据库(例如mysql)中,实现自增id只要在建表的时候指定一下即可, 但是在oracle中要借助sequence来实现自增id, 要用上自增id,有几种方式: 1.直接在insert语句中使用 ...
随机推荐
- 5、Mybatis之获取参数值
5.1.创建新module 5.1.1.右击SSM文件夹,创建新module 5.1.2.选择maven 5.1.3.配置module名称和路径 5.1.4.module初始状态 5.1.5.复制打包 ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-12-playwright操作iframe-中篇
1.简介 按照计划今天就要用实际的例子进行iframe自动化测试.经过宏哥长时间的查找,终于找到了一个含有iframe的网页(QQ邮箱和163邮箱),别的邮箱宏哥就没有细看了.所以今天这一篇的主要内容 ...
- .NET 操作 TDengine .NET ORM
TDengine 是国内比较流的时序库之一,支持群集并且免费,在.NET中资料比较少,这篇文章主要介绍SqlSugar ORM来操作TDengine 优点: 1.SqlSugar支持ADO.NET操作 ...
- Linq关联两个DataTable合并为一个DataTable
DataSet ds ; DataTable dt1= ds.Tables[0]; DataTable dt2= ds.Tables[1]; //关联 var res = from m in dt1. ...
- BZ全景可视化编辑器 (KRPano可视化编辑器, 无需编写任何代码制作全景漫游)
软件简介 BZ全景编辑器是一款KRPano全景可视化编辑工具,下载安装即可使用,无需拥有任何KRPano代码基础,便可以制作生成精美的全景漫游作品. 官方网站: 点击进入官方网站 最新版软件下载地址: ...
- WPF开发必备
类库 1.XamlFlair The goal of the XamlFlair library is to ease the implementation of common animations ...
- Springboot简单功能示例-4 自定义加密进行登录验证
springboot-sample 介绍 springboot简单示例 跳转到发行版 查看发行版说明 软件架构(当前发行版使用) springboot hutool-all 非常好的常用java工具库 ...
- Python基础——垃圾回收、格式化输入输出、基本运算符、流程控制
文章目录 每日测验 垃圾回收机制详解(了解) 引用计数 标记清除 分代回收 与用户交互 接收用户的输入 字符串的格式化输出 填充与格式化 基本运算符 算数运算符 比较运算符: >.>=.& ...
- Arduino 麦克风声音传感器指南
麦克风声音传感器 麦克风声音传感器,顾名思义,检测声音.它可以测量声音的响度. 这些传感器的种类繁多. 在下图中,您可以看到 Arduino 最常用的. 最左边是KY-038,右边是LM393麦克风 ...
- Linux: Authentication token is no longer valid
遇见问题: [oracle@sxty-jkdb-184:/u01/rman]crontab -l Authentication token is no longer valid; new one re ...