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的更多相关文章

  1. .NET面试题解析(03)-string与字符串操作

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 字符串可以说是C#开发中最常用的类型了,也是对系统性能影响很关键的类型,熟练掌握字符串的操作非常重要. 常 ...

  2. 一些面试题(关于string的)

    一些常见的面试题: String a = "hello2"; String b = "hello" + 2; System.out.println(a == b ...

  3. 【Java面试题】关于String,最近被问到了这2道面试题

    1. 前言 最近面试了几家公司,体验了一下电话面试和今年刚火起来的视频面试, 虽然之前就有一些公司会先通过电话面试的形式先评估下候选人的能力水平,但好像不多,至少我以前的面试形式100%都是现场面试. ...

  4. 006面试题__创建String对象

    常见面试题: String s = new String("hello"); 问:创建了几个对象? 答:2个 1. 创建了一个字符常量池,指向了"hello"字 ...

  5. 【Java面试题】15 String s="Hello"; s=s+“world!”;这两行代码执行后,原始的String对象中的内容到底变了没有?String与StringBuffer的超详细讲解!!!!!

    1.Java中哪些类是不能被继承的? 不能被继承的是那些用final关键字修饰的类.一般比较基本的类型或防止扩展类无意间破坏原来方法的实现的类型都应该是final的,在java中,System,Str ...

  6. 【Java面试题】-- Java String

    Java String 2019-11-02  17:40:45  by冲冲 1.String的内存位置 String是定义在 java.lang 包下的一个类.它不是基本数据类型.String是不可 ...

  7. 面试题中关于String的常见操作

    题目1: 将用户输入的一段话,每个单词的首字母大写, 每个单词之间的空格调整为只有一个,遇到数字,将数字与后一个单词用下划线 "_" 进行连接 题目2:将 i @@ am @@@ ...

  8. Java中创建String的两道面试题及详解

    我们知道创建一个String类型的变量一般有以下两种方法: String str1 = "abcd"; String str2 = new String("abcd&qu ...

  9. Java基础之String、StringBuffer、StringBuilder

    1:String类:字符串(重点) (1)多个字符组成的一个序列,叫字符串. 生活中很多数据的描述都采用的是字符串的.而且我们还会对其进行操作. 所以,java就提供了这样的一个类供我们使用. (2) ...

随机推荐

  1. js 无线弹窗

    无限弹窗 function fad(action){ alert('); ht = setTimeout() } fad(); fad()能放在 $().ready() 里面,效果也一样

  2. jquery 幻灯片 左右滚动

    使用jquery封装的一个幻灯片插件 写的好差  参考了别人写的 后面再重构 现在这个应该可以直接用了 主要实现思路就是 添加当前选中状态 index相对应的 选中的图总是在第一位(也就是加选中状态的 ...

  3. 汤森路透为何一定要卖掉SCI?

    http://health.sohu.com/20160714/n459331727.shtml

  4. read name 和 read 在 Bash 中的区别

    read 带一个参数和不带参数的区别是什么,我本以为仅仅是被赋值的变量的名字不同而已: $ read name 1 $ echo "$name" 1 $ read 1 $ echo ...

  5. JSP Servlet的区别

    主要体现在两点 1.JSP是类servlet jsp说得简单点就是用另一套简单的规则写的servlet程序,它可以写java代码,还可以写html代码,JavaScript,css等等……,但是到服务 ...

  6. DAY6 处理http头,格式化输出

    <html> <head> <script> function insertStr(str1,n,str2){ if(str1.length<n){ retu ...

  7. 各大搜索引擎智能提示API(JSONP跨域实现自动补全搜索建议)

    ---------------------------------------搜索引擎JSONP接口--------------------------------------------- 提示:U ...

  8. 检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(转)

    我们将ASP.NET程序从IIS6移植到IIS7,可能运行提示以下错误: HTTP 错误 500.23 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.N ...

  9. python3 爬虫

    保存当前cookie到本地 import urllib.request as ur import http.cookiejar as hc url='http://www.xxxx.com/admin ...

  10. VS中批注的使用

    SAL 是 Microsoft 源代码注释语言. 使用源代码批注,可以使代码背后的意图更加清晰. 这些注释还可以使用自动化的静态分析工具更准确地分析代码,显著减少误判.那么什么是批注,举个简单的例子, ...