Description "在树最漂亮的那天,当时间老人再次把大钟平均分开时,我会降临在灯火之城的金字塔前.带走那最珍贵的笑容."这是怪盗基德盗取巴黎卢浮宫的<蒙娜丽莎的微笑>这幅画时,挑战书上的内容. 但这次.怪盗基德的挑战书上出现了一串串小写字母"aaab sdfeeddd...". 柯南以小学生的眼睛.超凡高中生的头脑,高速统计各种字母频率.字符串长度,并结合挑战书出现的时间等信息,试图分析怪盗基德的意图.最后,他将线索锁定在字符串的循环次数上. 而…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4552 思路: 其实可以用KMP+DP解决 我这里给出后缀数组的解题方法 思路: 初始化ans=n(n为字符串的长度) 然后你会发现答案就是ans加上每个后缀与最长后缀的最长公共前缀的长度 代码: #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> using namesp…
hdu 3553 Just a String (后缀数组) 题意:很简单,问一个字符串的第k大的子串是谁. 解题思路:后缀数组.先预处理一遍,把能算的都算出来.将后缀按sa排序,假如我们知道答案在那个区间范围内了(假设为[l,r]),那么我们算下这个区间内的lcp的最小值(设最小值的位置为mid,大小为x),如果x*(r-l+1)>=k,那么,答案就是这个区间的lcp的最小值的某一部分(具体是哪一部分,画个图稍微算下就出来了).如果x * ( r - l + 1 ) < k 那么我们分两种情况…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4691 题意:给出Input,求出Compressed output.输出各用多少字节. 思路:求后缀数组.每次直接询问两个后缀的最长公共前缀. int r[N],sa[N],wa[N],wb[N],wd[N],rank[N],h[N]; int cmp(int *r,int a,int b,int len){    return r[a]==r[b]&&r[a+len]==r[b+len];}…
hdu 4691 Front compression 题意:很简单的,就是给一个字符串,然后给出n个区间,输出两个ans,一个是所有区间的长度和,另一个是区间i跟区间i-1的最长公共前缀的长度的数值的长度,加上不是公共部分的字符个数,加2,累加起来. 解题思路:后缀数组裸题..用rmq求最长公共前缀,询问就是o(1)的.有队伍用暴力的方法过的,对于i区间与i-1区间,如果左端点一样,就去长度小的那个,否则就暴力枚举相同的前缀.但我认为这样是不可以的,比如我的数据是10w个a,询问10w,第i个区…
题目 参考自:http://blog.sina.com.cn/s/blog_64675f540100k9el.html 题目描述: 找出一个字符串中至少重复出现两次的字串的个数(重复出现时不能重叠). 解题报告: 后缀数组即可解之. 枚举字串长度h 对于每一次的h,利用height数组,找出连续的height大于等于h的里面最左端和最右端得为之l和r. 如果l + h - 1 < r的话,说明没有重叠,答案加1. O(n^2)复杂度. #include<stdio.h> #include…
怪盗基德的挑战书 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 990    Accepted Submission(s): 478 Problem Description “在树最美丽的那天,当时间老人再次把大钟平均分开时,我会降临在灯火之城的金字塔前,带走那最珍贵的笑容.”这是怪盗基德盗取巴黎卢浮宫的<蒙娜丽莎的微笑>这幅画时,挑…
题意:给定一个字符串,问你它有多少个子串恰好出现 k 次. 析:后缀数组,先把height 数组处理出来,然后每次取 k 个进行分析,假设取的是 i ~ i+k-1,那么就有重复的,一个是 i-1 ~ i+k-1,另一个是 i ~ i+k,但是这样就删多了,再加上 i - 1 ~ i+k,这样就OK了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #inclu…
题目链接 题意 问两个字符串的最长公共子串. 思路 加一个特殊字符然后拼接起来,求得后缀数组与\(height\)数组.扫描一遍即得答案,注意判断起始点是否分别在两个串内. Code #include <bits/stdc++.h> #define maxn 200010 using namespace std; typedef long long LL; int a[maxn], wa[maxn], wb[maxn], wv[maxn], wt[maxn], h[maxn], rk[maxn…
Description Given two strings, you have to tell the length of the Longest Common Substring of them. For example: str1 = banana str2 = cianaic So the Longest Common Substring is "ana", and the length is 3. Input The input contains several test ca…