`
darren_nizna
  • 浏览: 72790 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

[FZU/FOJ][1872][A New Sequence Problem][后缀数组]

阅读更多

问题最终转化为,求出 height 数组后,求 max{ (j- i+ 1)* ( min( height[i..j] ) ) },相当于找一个最大的矩形。

求F(a^b)% c  因为 c 比较小,可求出其循环节。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef __int64 LL;

int const N= 200110;
int wa[N], wb[N], ws[N], wv[N];
int rank[N], height[N], sa[N], r[N], n;
int a, b, c;
int fib[1000010], hash[1010][1010];
int L[N], R[N];

int cmp( int* r, int a, int b, int L ){
	return r[a]== r[b] && r[a+ L]== r[b+ L];
}

void da( int* r, int* sa, int n, int m ){
	int i, j, p, *x= wa, *y= wb, *t;
	for( i= 0; i< m; ++i ) ws[i]= 0;
	for( i= 0; i< n; ++i ) ws[ x[i]= r[i] ]++;
	for( i= 1; i< m; ++i ) ws[i]+= ws[i-1];
	for( i= n- 1; i>= 0; i-- ) sa[ --ws[ x[i] ] ]= i;
	
	for( j= 1, p= 1; p< n; j*= 2, m= p ){
		for( p= 0, i= n- j; i< n; ++i ) y[p++]= i;
		for( i= 0; i< n; ++i )
		if( sa[i]>= j ) y[p++]= sa[i]- j;
		
		for( i= 0; i< n; ++i ) wv[i]= x[ y[i] ];
		for( i= 0; i< m; ++i ) ws[i]= 0;
		for( i= 0; i< n; ++i ) ws[ wv[i] ]++;
		for( i= 1; i< m; ++i ) ws[i]+= ws[i-1];
		for( i= n- 1; i>= 0; i-- ) sa[ --ws[ wv[i] ] ]= y[i];
		
		t= x, x= y, y= t; p= 1; x[ sa[0] ]= 0;
		for( i= 1; i< n; ++i )
		x[ sa[i] ]= cmp( y, sa[i-1], sa[i], j )? p- 1: p++;
	}
}

void calheight( int* r, int* sa, int n ){
	int i, j, k= 0;
	for( i= 1; i<= n; ++i ) rank[ sa[i] ]= i;
	
	for( i= 0; i< n; height[ rank[i++] ]= k )
	for( k? k--: 0, j= sa[ rank[i]- 1]; r[i+ k]== r[j+ k]; k++ );
}

int getRepeat(){
	for( int i= 0; i<= c; ++i )
	for( int j= 0; j<= c; ++j ) hash[i][j]= 0;
	
	fib[0]= 0; fib[1]= 1; hash[0][1]= 1;
	
	int i= 2;
	while( true ){
		fib[i]= ( fib[i-1]+ fib[i-2] )% c;
		if( hash[ fib[i-1] ][ fib[i] ] ) return i;
		hash[ fib[i-1] ][ fib[i] ]= 1;
		i++;
	}
}

int modExp( int a, int b, int c ){
	LL t= 1, x= a% c;
	while( b ){
		if( b& 1 ) t= t* x% c;
		x= x* x% c; b>>= 1;
	}
	return t% c;
}

int main(){
	int test;

	scanf("%d",&test );
	for( int te= 1; te<= test; ++te ){
		scanf("%d%d%d%d", &a, &b, &c, &n );
		int mod= getRepeat()- 1;
		
		int ans= modExp( a, b, mod );
		
		r[0]= ( ( (LL)fib[ans]* (LL)c )% 200003 );
		for( int i= 1; i< n; ++i )
		r[i]= ( ( (LL)r[i-1]* (LL) r[i-1] )% 200003 );
		
		r[n]= 0;
		for( int i= 0; i< n; ++i ) r[i]++;
		
		da( r, sa, n+ 1, 200010 );
		calheight( r, sa, n );
		
		int i, j;
		for( i= 0; i<= n; ++i ) L[i]= 0, R[i]= 0;
		for( i= 1; i<= n; ++i ){
			for( j= i; j> 1 && height[j]<= height[j-1]; j= L[j-1] );
			L[i]= j;
		}
		
		LL res= 0;
		for( i= n; i>= 1; i-- ){
			for( j= i; j< n && height[j]<= height[j+1]; j= R[j+1] );
			R[i]= j;
			
			if( (LL)( R[i]- L[i]+ 1 )* height[i]> res )
			res= (LL)( R[i]- L[i]+ 1 )* height[i];
		}
		printf("Case %d: %I64d\n", te, res );
	}
	
	return 0;
}
 
1
2
分享到:
评论

相关推荐

    字符串题目记录

    该题目使用后缀数组来解决,预处理时间复杂度为 O(|A|+|B|),然后使用二分搜索来找到相应的子串。 HDU 4029 Distinct Sub-matrix 该题目要求找出不同子矩形个数,N,M^7。该题目使用哈希函数来解决,枚举子矩形的列...

    FOj部分水题AC答案

    "FOj部分水题AC答案"这个标题表明这是一组来自FOj(可能是某个在线编程竞赛平台的简称)的简单问题,其中部分问题已经得到了正确的解答(AC是Accepted的缩写,表示程序通过了所有测试用例)。 在描述中提到"代Un的...

    fzu online judge

    对于想要掌握这门技能的人来说,参加在线编程评测,如fzu online judge,是一个行之有效的途径。fzu online judge是一个面向编程爱好者和学习者的平台,提供了丰富的算法题目,供用户在线解答。这些题目虽然难度不一...

    fzu 1698解题报告

    求最大乘积 的源代码 次题是fzu 4月月赛题 是一道数学题啊

    福大fzu OJ题目

    不要下载此版的,请下载最新的http://download.csdn.net/source/1664620 离线版的福大acm在线评测OJ系统题目 更新到2009年8月 (注:chm电子书格式化)

    Problem 1889 龟兔赛跑

    根据给定的信息,我们可以将问题转化为数学模型,然后进行分析。 ### 问题描述 第七届龟兔赛跑比赛在火星上举行。与以往不同的是,这次比赛的目标不是看谁先到达终点,而是谁能在规定时间内跑得更远。...

    Problem 1890 竞技游戏

    ### Problem 1890 竞技游戏 #### 题目背景 John 和 Smith 正在玩一种特别设计的竞技游戏。这个游戏涉及到一系列数字处理的策略与算法思考,对于初学者来说既是一个挑战也是一个很好的学习机会。游戏的具体规则如下...

    2021FZU计算机视觉作业(八)

    该函数接收四个参数:一个灰度图像数组arr,以及两个整数d_x和d_y,它们分别表示在水平和垂直方向上的像素偏移量,最后一个参数gray_level表示灰度级数,决定着共生矩阵的大小。 函数内部首先获取图像的最大灰度值...

    2021FZU计算机视觉期末复习

    计算机视觉是研究如何让计算机理解和解释视觉信息,使之能够复制人类对视觉信息的处理、分析和理解能力,并做出相应的行为决策。它涉及图像采集、处理、分析和理解等多个方面,广泛应用于工业自动化、监控系统、医疗...

    fzu大数据基础实验4

    fzu大数据基础实验4

    FZU飞跃手册 相关文件 (FZU Flying Book Relevant documents)

    (This is a collection of documents relating to our Leapfrog Handbook project, including member grouping information forms, task summary documents for each group member, a project diary, and other ...

    2011 ACM 多校联合 2011 MU11 13 FZU

    【标题】"2011 ACM 多校联合 2011 MU11 13 FZU" 指的是一项编程竞赛,ACM(国际计算机学会)每年都会举办多场这样的竞赛,旨在提升学生的算法设计和编程能力。ACM竞赛通常包括一系列的编程题目,参赛队伍需要在限定...

    FZU2021计算机视觉慕课答案(一)

    FZU2021计算机视觉慕课是一门面向学生和研究人员的基础课程,其中包含了丰富的实践案例和练习题。从提供的文件内容中,我们可以提取一些计算机视觉中的基础知识点,包括图像的读取、显示、转换、保存、以及图像处理...

    FZU2021计算机视觉答案(四)

    FZU2021计算机视觉答案(四)中包含了肤色检测的实验过程和代码实现,以下是从该文件中提取出来的知识点: 1. **肤色检测的基本原理**: 肤色检测通常基于色彩空间中的色度或亮度属性,例如,在RGB色彩空间中,...

    ACM数学_FZU绝密资料

    根据给定的文件标题“ACM数学_FZU绝密资料”及描述“ACM数学_FZU...............绝密..........”,我们可以看出这份资料主要聚焦于数学在ACM竞赛中的应用,尤其是在解决算法问题时数学理论的重要性。下面我们将从...

    FZU软件工程web课程复习资料-整理

    "FZU软件工程web课程复习资料-整理" 本资源是FZU软件工程web课程的复习资料,涵盖了web开发的基础知识和技术。下面是对该资源中所涉及的知识点的详细解释: 第一讲 web 开发概述 1. 因特网与万维网 因特网是一种...

    FZU软件工程操作系统课程复习资料-整理

    FZU软件工程操作系统课程复习资料-整理 本资源摘要信息是关于FZU软件工程操作系统课程复习资料的整理,涵盖操作系统的基本概念、进程和线程、存储管理和文件系统等方面的知识点。 一、操作系统的定义和主要功能 ...

    fzu—java张苏老师课件

    《fzu—java张苏老师课件》是一个针对Java初学者的课程资料集合,由一系列PPT文件组成,包括了从基础到进阶的多个章节。这个资源旨在帮助初学者系统地学习Java编程语言,逐步掌握其核心概念和技术。下面我们将详细...

    2021FZU计算机视觉作业(七)

    - 实现Harris角点检测首先需要将图像转换为灰度图像,并且转换为`np.float32`类型的数组以满足`cv2.cornerHarris`函数的输入要求。 - Harris检测角点后,通过`cv2.dilate`函数对检测结果进行膨胀操作,以增强图像...

Global site tag (gtag.js) - Google Analytics