Test of String
1、前言
这是我出的第一套题目,话说感觉有点晚了,还是在向总安排下出的。我被安排的是字符串方面的内容,这应该相对而言是比较小众的知识点吧,但是一样的有作用的,也有很神的题目。所谓是NOIP模拟题,其实只有两道题是在NOIP范围内的,但是要说很难的话,我觉得也不至于(可能是站在出题人的角度上吧)。
因为是第一次出题目,效率确实不怎么高,相比学长出题一天就是一套,我这一套出了快十天了,内容和数据是原创的,但是难免有模板题的感觉(毕竟不能太过头),除了部分出题思路有所参照之外。
2、Tea 喝茶
大概题意: 给出n个字符串,求有多少个字符串中的Q/W/E/R个数超过该字符串的字符个数的1/2。
题解:
由于我们要进行的操作就是查找字符串中的特殊字符,所以最简单有效的方法就是对于每一个字符串的每一个字符进行枚举,统计这个字符串中的Q/W/E/R个数,然后用该个数乘2看是否超过字符串总长度,求和即可。需要注意的是,由于大小写字母均存在,但是不区分,故需要进行两次判断或者进行大小写转化后再统计。时间复杂度为O(n∗len) ,其中len为所有字符串长度的平均值。
但是我们注意到,对于100%的数据,1≤n≤2000,字符串长度≤20000,题目的复杂度很高,一旦程序的常数写得过大,是很容易超时的。
3、Journey 归途
大概题意:给出一个长度为n的带权字符串和长度为m的子字符串,求子字符串是否出现在带权字符串中,且出现位置的最后一位之前的权值和是否超过限制权值,如果没有就输出该权值和。存在x组数据。
题解:
题目表面上似乎是一道图论题,n个节点,m条边,并且还带权值,但是所询问内容令人费解:在图中找到一段路。如果题目要求每个节点只能访问一次,这样当然是简单的,但是由于不限制次数,故可能出现若干个环,并且对于每一条边,每次经过的权值都是不同的!如果直接用无向图来维护的话,基本上是不可能的。所以,我们可以从另外一个角度来考虑:我们将所走的这段路铺平,不将其视为图中遍历,而是看作一个线性数组,而题目要求为在这个数组中找到另一个线性数组。这样,题意就已经很明确了:子串匹配母串。(即大概题意所述)
确定了字符串匹配这个大主题,直接想到的就是暴力枚举,时间复杂度为O(x∗n∗m)。根据题目所给数据范围,这显然是不能通过的。KMP算法可以很好地解决,时间复杂度为O(x∗(n+m))。当然扩展KMP算法也可行。
由于权值的存在以及对其的限制,我们只需要记录字符串中每个字符之前的权值之和,对于第一次成功匹配判断是否大于maxt,如果是的,则说明无法匹配上;相反地,直接输出权值和。
要注意到的是,由于2≤p≤m≤10^5, 1≤t[i]≤10^5,0≤maxt≤∑t×2,故超过int范围是不可避免的,所以需要开long long。
4、Piano 钢琴手
大概题意:给出一个带n个字符的字典,有m个禁用的单词,问能组成多少个不同的长度为m的字符串,不包括p个禁用的单词。如果不存在则输出-1。
题解:
n个字符,组成长度为m的字符串,假设我们无视那k个禁用单词的情况,那么情况为多少呢?其实就是个简单的数学问题,方案数为n^m。其实这样已经可以得到10分了!我们注意到,在数据点7-8中,由于每一个有问题的音乐片段长度和所弹奏长度相等,这样的话每禁止一个,方案数直接减1即可,即答案为n^m−k。
那么对于其他情况的话,不能简单的用公式来计算。首先可以确定的是,我需要构建AC自动机,将题目要表达的意思形象化。因为单词的禁用,不仅影响到其本身,而且只要一段之中有这个单词,就都算不合法,那么我们将这p个禁用的单词放入AC自动机中,设单词的最后一个字符的节点为i,则节点i的所有儿子节点就都不合法了。这也同样意味着,对于两个字符串a和b,如果a是b的前缀,那么禁用b是可以忽略的(想一想,为什么)。如图所示,假设给出一个字符集合为{a,b,c}的字典,禁用单词为:a,bb。则构建的AC自动机如下:

紫色表示插入AC自动机的禁用单词,灰色和紫色部分都是不可选的,而剩下的橙色的个数之和就是方案数了。
然而接下来就是如何计算方案数了。这里建议用简单方便的动态规划,用f[i][j]表示当前长度为i,字符为j的方案数。状态转移也非常简单:
f[i][j]=∑f[i−1][j],k表示能够在AC自动机中走到字符为j的节点的节点。
一切似乎都已经准备就绪,但是我们再来看一眼数据范围,当n=25,m=50时,答案最大可能高达25^50=7.89e+69,所以最后计算的时候,需要进行高精度运算。
5、Happiness 幸福
大概题意:给出n个字符串,找出最长公共子串,要求在每个字符串中都出现至少两次,并且没有重叠。
题解:
首先可以确定的是,单串匹配多串首选后缀数组。相比直接找最长公共子串,这道题附加的条件在于每个字符串内都要出现多次,且不重叠,那么暂时先不管,考虑如何求最长公共子串。
因为需要的是在每个字符串中都出现,我们显然不可能为每一个字符串都开一个后缀数组,这样操作麻烦,又浪费空间。可以考虑将所有的字符串全部连在一起,中间用特殊符号中断以区分。但是题意中写明了所有可见的字符都有可能出现,我们不能保证哪一个特殊符号不会在字符串中出现,所以可以考虑用一个标号数组进行区分,即num[i]表示第i个后缀在第num[i]个字符串中。
利用后缀数组,我们将每个后缀的名次计算出来,然后再计算相邻后缀的最长公共前缀,即height[i]。
现在考虑每个字符串内部需要出现多次的条件。其实在看明白了前面如何衔接不同字符串这个步骤之后,这就很好去写了,即将原来字符串之间的最长公共前缀修改成每个字符串内部的最长公共前缀。求解的过程用二分答案来完成,每次记录所有字符串内部一个位置的最大值和一个位置的最小值,观察差值,求出所有答案的最大值即可。
Test of String的更多相关文章
- 透过WinDBG的视角看String
摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...
- JavaScript String对象
本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...
- ElasticSearch 5学习(9)——映射和分析(string类型废弃)
在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...
- [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...
- js报错: Uncaught RangeError: Invalid string length
在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...
- c# 字符串连接使用“+”和string.format格式化两种方式
参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...
- 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...
- JavaScript中String对象的方法介绍
1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...
- 在多线程编程中lock(string){...}隐藏的机关
常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...
- BCL中String.Join的实现
在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的 ...
随机推荐
- AbstractExecutorService源码
public class RunnableFutureTask { static FinalizableDelegatedExecutorService executorService = (Fina ...
- HTML+css基础 Text文本属性
Text文本属性: 1.颜色 color color:red 2.文本缩进 text-indent 属性值 数字+px: text-indent:10px: 3.文本修饰 text-decorati ...
- 关于 AutoResetEvent 的介绍的简单示例
关于 AutoResetEvent 的介绍的简单示例 直接贴代码了: class Program { static void Main(string[] args) { string result = ...
- 使用Ueditor上传图片到图片服务器(二)
上一篇主要写了前端部分如何配置ueditor的上传路径,已经jsp页面中如何使用ueditor的编辑器功能以及如何配置单独的图片上传功能. 这一篇,我分两部分:第一部分是搭建图片服务器以及配置ftp上 ...
- WPF 精修篇 WPF嵌入Winfrom控件
原文:WPF 精修篇 WPF嵌入Winfrom控件 先增加DLL 支持 使用 WindowsFormsHost 来加载Forms的控件 引用命名空间 xmlns:forms="clr-na ...
- 使用Fiddler抓取手机APP数据包--360WIFI
使用Fiddler抓取手机APP流量--360WIFI 操作步骤:1.打开Fiddler,Tools-Fiddler Options-Connections,勾选Allow remote comput ...
- 安全漏洞系列(一)---XSS漏洞解决方案(C# MVC)
参考地址:https://www.cnblogs.com/sagecheng/p/9462239.html 测试项目:MVCDemo 一.XSS漏洞定义 XSS攻击全称跨站脚本攻击,它允许恶意web用 ...
- PIE SDK 精度分析(分类后处理)
1.算法功能简介 遥感图像分类精度分析通常把分类图与标准数据进行比较,然后用正确分类的百分比来表示分类的精度. PIE SDK支持算法功能的执行,下面对精度分析算法功能进行介绍. 2.算法功能实现说明 ...
- Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)
0x00 漏洞描述 Windows系列服务器于2019年5月15号,被爆出高危漏洞,该漏洞影响范围较广如:windows2003.windows2008.windows2008 R2.windows ...
- Linux的权限管理操作-Linux从入门到精通第八天(非原创)
文章大纲 一.网络相关概述二.网络相关命令三.项目上线流程(必须掌握)四.学习资料下载五.参考文章 一.网络相关概述 1. 网络发展 1.1 信息传递远古时期,人们就通过简单的语言.壁画等方式交 ...