摘要:
题意是让我们求取两个字符串前缀和后缀最长的相同子串的长度的平方和 首先,查找两个字符串是否相同可以采用hash的方法,因此可以想到先对所有串的所有后缀求一遍hash 之后枚举每一个串的前缀,观察是否有后缀相同,计算每个前缀相同的后缀数 但是这个并不是答案,原因就是会有重复的被计算进来。 例如题解中的 阅读全文
摘要:
题目的含义是将一个字符串的所有后缀按算出来的B函数从小到大按字典序排序 首先观察到题目给定的只有ab两个字符,并且b函数给的是与当前位置之前的最近的相同的字符的位置差值 首先暴力的思想就是对每个后缀算一遍b函数,但是发现这样是超时的,因此考虑能否进行优化 我们观察到B函数会变化的原因是,我们求到某个 阅读全文
摘要:
只需要把两个串拼接起来,之后求一下后缀数组求可覆盖最长重复子串模板即可 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> using namespace std; ty 阅读全文
摘要:
题目求的是差分后的最长不重复相同子串 利用后缀数组求解,首先答案具有二分性,也就是重复子串越大越好 因此先二分最长长度,根据最长长度将所有后缀分组按height数组分组 依据是height数组具有排名相邻的肯定是lcp最大的,而因此如果一段相邻的height数组的大小都大于等于二分值,这说明这段排名 阅读全文
摘要:
未优化 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=1e6+10; char s[N]; int cnt[N],id[N],rk[N 阅读全文
摘要:
无向图点双建立园方树,并且记录边在哪个点双之内 #include<bits/stdc++.h> using namespace std; typedef pair<int,int> pll; const int N=3e5+10; int h[N],e[N],ne[N],idx; int dfn[N 阅读全文
摘要:
本题如果k的范围较小的话,可以使用树状数组记录答案,但是因为很大 考虑使用双指针+容斥原理。 也就是直接算整个子树的答案,之后再在枚举儿子节点的时候,把加上u-v这条边的合法答案全部清除,这样就做到了不重不漏 #include<bits/stdc++.h> using namespace std; 阅读全文
摘要:
观察到如果两个位置是对称的,那么他们永远是对称的,这种输出yes和no并且没啥其他性质的,看和猜结论比较有用 因此只要把对称位置的变成一组,比较两个数组的所有组是否相等,如果相等就可以 具体证明可以看官方题解 #include<iostream> #include<algorithm> #inclu 阅读全文
摘要:
本题不用边读边做,可以先读入所有边记录序号 排序后,求取m次最小生成树,参与生成的是序号小于当前次数的边 #include<iostream> #include<algorithm> #include<stack> #include<vector> #include<cstring> #includ 阅读全文
摘要:
先求一下lca,之后比较一下给定两点的lca与所求点的关系后分类讨论 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+10; int h[N],ne[N],e[N],idx; int 阅读全文