首页 > 其他分享 >C. 字符序列

C. 字符序列

时间:2024-07-20 20:42:18浏览次数:8  
标签:字符 right vert sum 字符串 序列 left

简要题意:有一个函数 \(f(c,s)=cs_1cs_2cs_3\cdots cs_nc\)。给出操作序列 \(c_i\),每次操作使 \(s=f(c_i,s)\)(\(s\) 开始为空串),求最后的字符串中有多少个本质不同的子序列。

数据范围: \(n\le 500\)。

首先我们可以考虑一个简化经典问题,已知一个字符串,求本质不同的子序列数量。

因为我们需要把所有本质不同的子序列在字符串中找到唯一的映射,所以我们贪心的钦定每个字符都取字符串中第一个出现的,而不取第二次出现的。

可设 \(f_{i,j}\) 表示考虑完了 \(i\cdots n\) 的字符,开头为 \(j\) 的本质不同子序列数量。

\(f_{i,j}=\begin{cases}f_{i+1,j}&a_i\ne j\\\sum\limits_c f_{i+1,c}+1&a_i=j\end{cases}\)

假如已知这个字符串,\(O(N\left\vert \sum\right\vert)\) 转移即可。放在这题中可以得到 50pts。

考虑正解,显然字符串非常大,无法求出,我们观察每次操作的字符串之间有什么规律。

a
bab
cbcacbc
dcdbdcdadcdbdcd

我们容易发现,若设 \(T_i\) 为 \(i\) 到 \(n\) 操作后的序列,那么字符串的变化可以写成 \(T_i=T_{i+1}+c_i+T_{i+1}\)。最终字符串即为 \(T_1\)。

回到 \(dp\),转移方程为求和的形式,只由 \(i+1\) 转移过来,容易写成矩阵转移的形式,虽然在已知字符串的情况下复杂度为 \(O(N\left\vert \sum\right\vert^3)\),但是它不需要顺推,在对于有规律的字符串变化中可以直接矩阵转移。

复杂度为 \(O(n\left\vert \sum\right\vert^3)\)。

标签:字符,right,vert,sum,字符串,序列,left
From: https://www.cnblogs.com/FireRaku/p/18313747

相关文章

  • 在pyspark(python)中将json字符串扩展到多列
    我需要将Json对象(b列)扩展到多列。从此表中,A列B列id1[{a:1,b:'letter1'}]id2[{a:1,b:'letter2',c:3,d:4}]对......
  • 字符串算法之一:朴素算法找子串
    publicclassStringAlgorithm{publicstaticvoidmain(String[]args){intresult=plainFindSubStr("12345","1234");System.out.println(result);}/***@paramstr*@parampattern*@retu......
  • 字符串中嵌入空字符`\0`,出现警告
    代码:#include<stdio.h>intmain(){charstr[]="Hello\0World";//在字符串中嵌入了空字符printf("%s\n",str);//这可能会导致警告return0;}在这个例子中,字符串str包含一个嵌入的空字符\0,这会导致printf函数只打印出"Hello"而忽略后面的部......
  • Python中,如何使用反斜杠 “\“分割字符串?
    Python语言使用反斜杠(\)作为转义符,对一些字符进行转义(escape),例如"\n""\r\n"等。所以当Python字符串中如果出现反斜杠,则会自动转义其后的字符。但这会导致一个问题,就是,如果只是把反斜杠作为字符字面(liberal)意义,应该如何处理?如果不使用re模块(regularexpressionmodule),在Py......
  • leetcode位运算(3211. 生成不含相邻零的二进制字符串)
    前言经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。接下来重点专项练习,加强重难点知识的练习。描述给你一个正整数 n。如果一个二进制字符串 x 的所有长度为2的子字符串中包含 至少 一个 "1",则称 x 是一个 有效 字符串。返回所有长度......
  • 字符函数和字符串函数
    ⽬录:1.字符分类函数2.字符转换函数3.strlen的使⽤和模拟实现4.strcpy的使⽤和模拟实现5.strcat的使⽤和模拟实现6.strcmp的使⽤和模拟实现7.strncpy函数的使⽤8.strncat函数的使⽤9.strncmp函数的使⽤10......
  • 掌握Python中的文件序列化:Json和Pickle模块解析
    Python文件操作与管理:Open函数、Json与Pickle、Os模块在Python中,文件是一个重要的数据处理对象。无论是读取数据、保存数据还是进行数据处理,文件操作都是Python编程中不可或缺的一部分。本文将详细介绍Python中文件操作的几种常用方法,包括open函数的使用、数据序列化与反......
  • 【序列化和反序列化】
    序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在Java中,这通常意味着将对象转换为字节流,以便可以将其保存到磁盘上或通过网络传输到另一个网络节点。相反,反序列化(Deserialization)是将已序列化的数据恢复为对象的过程。序列化的基本概念为了能......
  • 字符串选讲
    树状数组维护区间哈希值重点,区间长度=\(lowbit(x)\)#include<bits/stdc++.h>usingnamespacestd;usingint128=__int128;usingLL=longlong;constintN=1e6+6;LLc[4][N],sum,bpow[N],b=100591,mod=1e18+31,u;intn,q,op,l,r,x;char......
  • day 7二维整型数组、字符型数组
    二维整形数组1、二维整形数组的定义:    数据类型数组名[第一维数组的元素个数][第二维数组的元素个数];    数据类型数组名[行数][列数];    例如:inta[2][3];2、数组元素的访问:    数组名[行下标][列下表];    例如:a[0][......