题面

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. adb的那点小事——360电视助手实现研究

    欢迎转载,转载请注明:http://blog.csdn.net/zhgxhuaa 1.   前言 1.1.  行业背景简单介绍 当下,智能家居与智能穿戴设备无疑是继智能手机后两个最热门的方向.而智能家 ...

  2. Redis+EJB实现缓存(一)

        上篇博客大概的对Redis做了一个主要的了解.由于刚刚接触自己也不太明确.所以上篇博客写的乱七八糟的.这篇由于项目须要,学习了一下Redis和EJB集成. 如今脑子相对照较清晰了一些. 实现思 ...

  3. Spring Batch(4): Job具体解释

    第四章 配置作业Job 4.1 基本配置 Job的配置有3个必须的属性.name,jobRepository,steps.一个简单的Job配置例如以下: <job id="footba ...

  4. 将线上服务器生成的日志信息实时导入kafka,采用agent和collector分层传输,app的数据通过thrift传给agent,agent通过avro sink将数据发给collector,collector将数据汇集后,发送给kafka

    记flume部署过程中遇到的问题以及解决方法(持续更新) - CSDN博客 https://blog.csdn.net/lijinqi1987/article/details/77449889 现将调 ...

  5. Flume接收器组的指数退避上限

    指数退避 agent.sinkgroups.sg1.sinks=k1,k2,k3agent.sinkgroups.sg1.processor.type=failoveragent.sinkgroups ...

  6. 手游服务器php架构比较

    从swoole项目开始到现在,一直有人在问这个问题.今天来抽空讲一下它.为什么swoole非要使用纯C来写而不是PHP代码来实现,核心的原因有2点: 1. PHP无法直接调用操作系统API 如send ...

  7. C++ HOJ 火车进站

    [问题描写叙述] 给定一个正整数N代表火车数量.0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号. 要求以字典序排序输出火车出站的序列号. 输入:   有多组 ...

  8. pageHelper没有分页效果的问题

    配置完全都没有问题 springboot pagehelper分页怎么都不管用 而且所有的信息记录全部都查出来了 解决方法: PageHelper.startPage(pageNum,pageSize ...

  9. 一步一步学Silverlight 2系列(19):如何在Silverlight中与HTML DOM交互(上)

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  10. 【NOIP 2003】 加分二叉树

    [题目链接] 点击打开链接 [算法] 树形DP即可 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 50 in ...