UOJ #35 后缀排序 哈希做法
题面
题解
后缀数组当然可以
这里用哈希做
首先排序的问题在哪里
在于比较两个后缀的复杂度是O(length)的
但是我们可以通过找LCP来优化比较
我们二分两个串的LCP的长度 然后通过hash值判断是否相同
这样我们可以在$O(\log l)$的时间内算出两个串的LCP长度
所以排序的复杂度变成$O(n \log ^2 n )$
然后求出连续两个后缀的LCP还是用二分的方法做 复杂度$O(n \log n)$
总的复杂度$O(n \log ^2 n)$
Code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll; ll read(){
ll x=,f=;char c=getchar();
while(c<'' || c>''){if(c=='-')f=-;c=getchar();}
while(c>='' && c<=''){x=x*+c-'';c=getchar();}
return x*f;
} const int maxn=;
const int mod=1e9+;
int mu[maxn],pr[maxn],cnt;
bool isp[maxn];
int fib[maxn],g[maxn],G[maxn],invG[maxn];
int fpw[maxn][]; inline int ksm(int a,int b){
int ret=;
for(int i=;i<=;i++){
if(b&) ret=ret*1ll*a%mod;
a=a*1ll*a%mod;
b=b>>;
if(b==) return ret;
}
} inline int inv(int a){
return ksm(a,mod-);
} int main(){
#ifdef LZT
freopen("in","r",stdin);
#endif
mu[]=;
memset(isp,,sizeof(isp));
for(int i=;i<=;i++){
if(isp[i]){
pr[++cnt]=i;
mu[i]=-;
}
for(int j=;j<=cnt && i*pr[j]<=;j++){
isp[i*pr[j]]=;
if(i%pr[j]==) break;
mu[i*pr[j]]=-mu[i];
}
} fib[]=;
for(int i=;i<=;i++)
fib[i]=(fib[i-]+fib[i-])%mod;
for(int i=;i<=;i++){
fpw[i][]=inv(fib[i]);
fpw[i][]=;
fpw[i][]=fib[i];
}
for(int i=;i<=;i++)
g[i]=;
for(int i=;i<=;i++)
for(int j=i;j<=;j+=i)
g[j]=g[j]*1ll*fpw[i][mu[j/i]+]%mod;
G[]=;
for(int i=;i<=;i++)
G[i]=G[i-]*1ll*g[i]%mod; invG[]=;
for(int i=;i<=;i++)
invG[i]=inv(G[i]); int tc=read();
while(tc--){
int n=read(),m=read();
int j;
int ans=;
for(int i=;i<=min(n,m);i=j+){
j=min(n/(n/i),m/(m/i));
ans=ans*1ll*ksm(G[j]*1ll*invG[i-]%mod,(n/i)*1ll*(m/i)%(mod-))%mod;
}
printf("%d\n",ans);
} return ;
}
UOJ #35 后缀排序 哈希做法的更多相关文章
- UOJ #35. 后缀排序[后缀数组详细整理]
#35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符 ...
- Uoj #35. 后缀排序(后缀数组)
35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在 ...
- UOJ#35 后缀排序
这是一道模板题. 读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 1 到 n. 除此之外为 ...
- UOJ #35. 后缀排序 后缀数组 模板
http://uoj.ac/problem/35 模板题,重新理了一遍关系.看注释吧.充分理解了倍增的意义,翻倍之后对上一次排序的利用是通过一种类似于队列的方式完成的. #include<ios ...
- UOJ#35 —— 后缀排序
1.题目大意:后缀数组模板题 2.分析:汝佳的书上的代码的有bug,还有那个n是字符串长度+1,''也要加入排序的 存个模板QAQ #include <cstdio> #include & ...
- 【后缀数组】uoj#35. 后缀排序
模板 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #de ...
- uoj#35 后缀排序(后缀数组模版)
#include<bits/stdc++.h> #define N 100005 using namespace std; char s[N]; int a[N],c[N],t1[N],t ...
- UOJ 35 后缀数组
后缀数组裸题,求排名第1~n的后缀,想相邻后缀的最长公共前缀. 集训队模板就是硬lO(∩_∩)O哈哈~ #include <cstdio> #include <cmath> # ...
- PAT TOP 1005 Programming Pattern (35 分)哈希做法
1005 Programming Pattern (35 分) Programmers often have a preference among program constructs. For ex ...
随机推荐
- Spring Boot与Micronaut性能比较
文章转载出处:微信公众号——锅外的大佬 链接:https://mp.weixin.qq.com/s/MdBByJ0ju-rROKg7jsWygA 今天我们将比较两个在JVM上构建微服务的框架:Spri ...
- WEBGIS控制图层的显示
看别人搞的GIS应用,常常有勾选.取消某个图层的操作,然后地图上就有相应的图形显隐,觉得好酷. 咋实现的? 其实说起来好像也不是特别复杂.在WEB端,实现该功能的原理和步骤是: 1.WEB端加载地图服 ...
- 3531: [Sdoi2014]旅行
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 1731 Solved: 772 [Submit][Statu ...
- SpringInAction4笔记——装配
重点:常用的上下文环境 AnnotationConfigApplicationContext ClassPathXmlApplicationContext FileSystemXmlApplicati ...
- 更多的使用自定义元素(CustomElement)。
更多的使用自定义元素(CustomElement).
- gRPC错误码 http状态码 provide your APIs in both gRPC and RESTful style at the same time
How gRPC error codes map to HTTP status codes in the response https://github.com/grpc-ecosystem/grpc ...
- Delphi如何实现多国语言
Delphi里的多语言处理方法都一样, 都是通过资源DLL的形式进行加载处理. Delphi在加载form数据的时候会判断当前的系统语言,然后根据语言加载不同的资源dll, 来实现多国语言的功能. 下 ...
- [树套树]K大数查询
有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少.为了 ...
- ReactNative Android 研究
先从ReactRootView入手吧,它是一个FrameLayout mReactRootView.startReactApplication 这的start其实是会等到inital onMeasur ...
- YTU 2878: 结构体--学生信息排序
2878: 结构体--学生信息排序 时间限制: 1 Sec 内存限制: 128 MB 提交: 297 解决: 148 题目描述 定义存放一个学生信息的结构体类型,学生信息包括:姓名,学号,性别,院 ...