随笔分类 - 字符串
摘要:模拟题,意思是一个字符串,单词直接用','或';'来分割,可以为空,把不含前导0的整数和其他单词分别放入A和B。按照一定格式输出。没有用stl的习惯。维护两个下标i,j,表示开区间(i,j),两段补上分割符号。每个单词后面都加上一个',',输出的时候在处理掉。用最后的','判断A和B是不是空。#in...
阅读全文
摘要:E. Kefa and Watchtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputOne day Kefa the parrot was walk...
阅读全文
摘要:以前听过,不知道是什么,其实就是字符串首尾相连成一个环,n种切法求一个字典序最小的表示。朴素算法大家都懂。O(n)的算法代码非常简单,最主要的思想是失配的时候尽可能大的移动指针。另外附上一个不错的字符串算法总结:http://duanple.blog.163.com/blog/static/7097...
阅读全文
摘要:kmp的代码很短,但是不太容易理解,还是先说明一下这个算法过程吧。朴素的字符串匹配大家都懂,但是效率不高,原因在哪里?匹配过程没有充分利用已经匹配好的模版的信息,比如说,i是文本串当前字符的下标,j是要匹配的模版串当前正在匹配的字符的下标。(下标都从零开始,j同时可以表示已经匹配的字符长度)当匹配到...
阅读全文
摘要:先两两比较,比较次数是两者相同的最长前缀长度*2+1,比较特殊的情况是两者完全相同时候比较次数是单词长度*2+2,两个单词'末尾\0'和'\0'比较一次,s尾部'\0'和循环内'\0'比较一次。因此,对于一个单词,只要知道和它某个相同的最长前缀的单词数就可以计算出方案数了。用tire,记录一颗子树上...
阅读全文
摘要:状态是DAG,因此方案用dp统计,dp[i] = sum(dp[i+len(x)]),x是以i开头的前缀且是单词,关键在于快速判断一个前缀是不是单词,可用Trie。每一次转移的复杂度是O(maxlen),maxlen是单词的最长长度。#includeusing namespace std;const...
阅读全文
摘要:模拟题,map搞一搞。要想清楚一个结点应该是要通过一个字符串找到下一个结点,题目保证所以文件夹非空,所以只要判断一个结点是不是叶子结点就可以判断它是不是文件,用了点c11的特性。#includeusing namespace std;typedef map Node;map::iterator it...
阅读全文
摘要:最短路问题,不过起点不只是1个,终点也不止1个,因此把不同电梯的楼层分别编号,相邻楼层之间连边,不同电梯的相同楼层之间连边。dij的时候一次性把所有起点压到队列中,如果直接套版可以加一超级源点s和所有起点连一条dist为0的边。需要维护的信息:为了判断之前电梯有没有出现相同楼层,需要维护一个楼层到点...
阅读全文
摘要:题意:给出一个后缀表达式f(x),最多出现一次x,解方程f(x) = 0。读取的时候用一个栈保存之前的结点,可以得到一颗二叉树,标记出现'X'的路径,先把没有出现'X'的子树算完,由于读取建树的时候是由底向上的,这步可以在读取的时候顺带完成。注意'X'或'1/x'在某个结点和'0'相乘,那么'X'等...
阅读全文
摘要:阅读题,概要:给出垃圾邮件和非垃圾邮件的集合,然后按照题目给出的贝叶斯公式计算概率一封邮件是垃圾邮件的概率。逐个单词判断,将公式化简一下就是在垃圾邮件中出现的次数和在总次数的比值,大于二分之一就算是垃圾邮件的单词。如果一个邮件里的垃圾邮件的单词出现次数超过给定比例就算是垃圾邮件。需要注意的地方是:一...
阅读全文
摘要:d[i]表示前面i个字符划分成的最小回文串个数,转移:当第i字符加进来和前面区间j构成回文串,那么d[i] = d[j]+1。要判断前面的字符j+1到i是不是回文串,可以用Manacher算法预处理出来。(其实O(n^2)判断回文串的也可以,时间复杂度不会变,只是为了学习ManacherManach...
阅读全文