bzoj3230】的更多相关文章

原文链接http://www.cnblogs.com/zhouzhendong/p/9033092.html 题目传送门 - BZOJ3230 题意 给定字符串$s$.长度为$n$. 现在有$Q$组询问,每组询问内容如下: 两个正整数$i,j$. 设$s_i,s_j$分别表示$s$的所有本质不同的子串中字典序第$i$小和第$j$小的子串. 请你输出$|lcp(s_i,s_j)|^2+|lcs(s_i,s_j)|^2$. 如果不存在$s_i$或者$s_j$,则输出$-1$. $n,Q\leq 10…
Portal -->bzoj3230 Description 给你一个长度为\(n\)的字符串,把它的所有本质不同的子串按字典序大小排序,有\(m\)个询问,对于每一个询问\(x,y\)你需要回答排名\(x\)和子串和排名\(y\)的子串的最长公共前缀的平方和+最长公共后缀的平方和,如果询问不合法输出\(-1\) 数据范围:\(n<=10^5,m<=10^5\),字符串只含有小写字母 Solution ​ 虽然说貌似是..后缀数组的裸题.. ​ 但是场上没有写出来..所以还是拎出来智力康…
[BZOJ3230]相似子串 Description Input 输入第1行,包含3个整数N,Q.Q代表询问组数.第2行是字符串S.接下来Q行,每行两个整数i和j.(1≤i≤j). Output 输出共Q行,每行一个数表示每组询问的答案.如果不存在第i个子串或第j个子串,则输出-1. Sample Input 5 3 ababa 3 5 5 9 8 10 Sample Output 18 16 -1 HINT 样例解释第1组询问:两个子串是“aba”,“ababa”.f = 32 + 32 =…
BZOJ3230 相似子串 给一个串,查询排名i和j的子串longest common suffix和longest common prefix 思路其实还是蛮好想的,就是码起来有点恶心.可以发现后缀拍完序之后的子串可以根据sa自前而后的顺序标子串排名,和统计不同字串那里差不多,自lcp后的是新子串,开始标记排名.实际操作时在每个后缀上标这一后缀开始第一个新子串排名,可证是单调增的,然后查询就二分查出子串开始的后缀也就是位置啦,然后用st表维护子串(所在后缀的)lcp即可.lcs的话就把串反转一…
显然可以通过后缀数组快速找到询问的两个串分别是什么,然后正反各建一个后缀数组来求两个串的LCP和LCS即可. #include<cstdio> #include<cstring> #include<algorithm> #define rep(i,l,r) for (int i=(l); i<=(r); i++) typedef long long ll; using namespace std; ,inf=1e9; char s[N]; ll ans,x,y;…
3230: 相似子串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 913  Solved: 223[Submit][Status]Description Input 输入第1行,包含3个整数N,Q.Q代表询问组数.第2行是字符串S.接下来Q行,每行两个整数i和j.(1≤i≤j). Output 输出共Q行,每行一个数表示每组询问的答案.如果不存在第i个子串或第j个子串,则输出-1. Sample Input 5 3 ababa 3 5 5 9…
以前觉得这题好难,现在觉得这题还是挺简单首先看到类似LCP问题不难想到后缀数组吧前后的相似需要我们分别做一个后缀数组和“前缀数组”(就是把字符串反向然后跑后缀数组)这道题的难点就在于如何确定子串是什么考虑到一个有用的结论:任何一个子串都是某一个后缀的某一个前缀由于做完后缀数组之后,后缀已经按照从小到大排列了因此考虑相邻名次后缀sa[i]和sa[i-1],然后在这两个后缀间,还夹着一些子串不难发现,这些子串就是后缀sa[i]从第h[i]+1位开始的前缀为什么是从h[i]+1开始的前缀呢,因为前缀1…
题目分析: 容易想到sa排好序之后,子串排名就是前面的子串减去height数组.所以正着做一遍,倒着做一遍就行了. 代码: #include<bits/stdc++.h> using namespace std; ; ; int n,q; char str[maxn]; int sa[maxn],rk[maxn],X[maxn],Y[maxn]; ]; int len[maxn],st1[maxn],st2[maxn]; long long stnum[maxn]; int chk(int x…
传送门 后缀数组入门题. 建立正反两个后缀数组算就行了. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; typedef long long ll; const int N=2e5+5; int n,m,q,sa2[N],Log[N],cnt[N]; ll num[N]; char s[N]; struct SA{ int sa[N],rk[N],ht[N],st[N][21]; inline v…
Description Input 输入第1行,包含3个整数N,Q.Q代表询问组数. 第2行是字符串S. 接下来Q行,每行两个整数i和j.(1≤i≤j). Output 输出共Q行,每行一个数表示每组询问的答案.如果不存在第i个子串或第j个子串,则输出-1. Sample Input 5 3 ababa 3 5 5 9 8 10 Sample Output 18 16 -1 HINT 样例解释 第1组询问:两个子串是"aba","ababa".f = 32 + 32…