题面

http://uoj.ac/problem/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 后缀排序 哈希做法的更多相关文章

  1. UOJ #35. 后缀排序[后缀数组详细整理]

    #35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符 ...

  2. Uoj #35. 后缀排序(后缀数组)

    35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在 ...

  3. UOJ#35 后缀排序

    这是一道模板题. 读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 1 到 n. 除此之外为 ...

  4. UOJ #35. 后缀排序 后缀数组 模板

    http://uoj.ac/problem/35 模板题,重新理了一遍关系.看注释吧.充分理解了倍增的意义,翻倍之后对上一次排序的利用是通过一种类似于队列的方式完成的. #include<ios ...

  5. UOJ#35 —— 后缀排序

    1.题目大意:后缀数组模板题 2.分析:汝佳的书上的代码的有bug,还有那个n是字符串长度+1,''也要加入排序的 存个模板QAQ #include <cstdio> #include & ...

  6. 【后缀数组】uoj#35. 后缀排序

    模板 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #de ...

  7. uoj#35 后缀排序(后缀数组模版)

    #include<bits/stdc++.h> #define N 100005 using namespace std; char s[N]; int a[N],c[N],t1[N],t ...

  8. UOJ 35 后缀数组

    后缀数组裸题,求排名第1~n的后缀,想相邻后缀的最长公共前缀. 集训队模板就是硬lO(∩_∩)O哈哈~ #include <cstdio> #include <cmath> # ...

  9. PAT TOP 1005 Programming Pattern (35 分)哈希做法

    1005 Programming Pattern (35 分) Programmers often have a preference among program constructs. For ex ...

随机推荐

  1. Linux编程---进程通信

    Linux的通信方式主要有分类有以下几种: -匿名管道和FIFO有名管道 -消息队列,信号量和共享存储 -套接字 对于套接字的进程通信,我就留在套接字的文章中再写了. 一.管道 管道是最古老的进程通信 ...

  2. atitit.窗口静听esc退出本窗口java swing c# .net php

    atitit.窗口静听esc退出本窗口java swing c# .net php 1. 监听esc  按键 1 1.1. 监听一个组件 1 1.2. 监听加在form上 1 2. 关闭窗口 2 1. ...

  3. Java基础 面向对象的详解

    1.1 万物皆对象 我们是怎么认识世界的? 人类从小就不断的接触到各种各类存在世界上的各种生物,然后通过事物的公共特性,将它们归类,所以以后就不会出现见到猫叫老虎.那么我们在现实生活中,是通过具体的某 ...

  4. openwrt: sysupgrade

    sysupgrade 用法: sysupgrade [...] sysupgrade [-q] [-i] 升级选项: -d 重启前等待 delay 秒 -f 从 .tar.gz (文件或链接) 中恢复 ...

  5. C++ 四种强制类型转变与区别之处

    使用标准C++的类型转换符:static_cast.dynamic_cast.reinterpret_cast和const_cast.1.static_cast    用法:static_cast&l ...

  6. MapReduce简述、工作流程及新旧API对照

    什么是MapReduce? 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查而且数出有多少张是黑桃. MapReduce方法则是: 1. 给在座的全部玩家中分配这摞牌. 2. 让每一个玩家数自己手 ...

  7. 2017ACM/ICPC广西邀请赛 K- Query on A Tree trie树合并

    Query on A Tree Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Othe ...

  8. CSS3 弹性盒子(Flex Box) 微信小程序图片通栏

    {{define "chkUrl"}} <!DOCTYPE html><html lang="zh-cmn-Hans"><head ...

  9. inheritance super overrides printMethod in Superclass override重写父方法

    Core Java Web Page http://horstmann.com/corejava.html [ inheritance ] package v1ch05.inheritance; im ...

  10. hihocoder 1082 然而沼跃鱼早就看穿了一切 (替换指定的串 )

    #1082 : 然而沼跃鱼早就看穿了一切 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 fjxmlhx每天都在被沼跃鱼刷屏,因此他急切的找到了你希望你写一个程序屏蔽所有句 ...