后缀数组

后缀数组
后缀数组

软件工程综合应用例题解析

软件工程综合应用例题 第一部分 《结构化软件开发方法》 1、根据下列描述,画出教材征订系统的第一层数据流图。学生入学后到教材科订书,教材科根据教材库存情况分析是否需要买书,如需购买,则向书店购买。各种资金往来通过学校的会计科办理。 解: 2、高考录取统分子系统有如下功能: (1) 计算标准分:根据考生原始分计算,得到标准分,存入考生分数文件; (2) 计算录取线分:根据标准分、招生计划文件中的招生人数,计算录取线,存入录取线文件。 试根据要求画出该系统的数据流程图,并将其转换为软件结构图。 解:(1)数据流图: (2)软件结构图: ① 原始分 ② 标准分 ③ 招生计划 ④ 录取线 3、有下列伪码程序: START INPUT (M,N) IF M>=10 THEN X:=10 ELSE X:=l ENDIF IF N>=20 THEN Y:=20 ELSE Y:=2 ENDIF PRINT(X,Y) STOP

设计该程序的语句覆盖和路径覆盖测试用例。 解: 语句覆盖测试用例为 ①M=9(或=10),N=20(或>=20) 路径覆盖的测试用例为 ①M=9,N=19; ②M=9、N=20; ③M=l0,N=l9; ④M=10,N=20 4、画出下列伪码程序的程序流程图、盒图(N-S图)、PAD图。 START IF p THEN WHILE q DO F END DO ELSE BLOCK g n END BLOCK END IF STOP 解: 5、根据下面程序流程图,给出测试用例: 解:路径覆盖可使用测试用例: ⑴【A=1,B=1,X=1】 ⑵【A=1,B=1,X=2】

软件工程综合应用例题(题)

综合应用例题 第一部分传统软件开发方法 1、某一8位计算机,其十六进制常数的定义为:以0x或0X开头的数是十六进制整数,其值的 围是-7f至7f(大小写字母不加区别),如0x13,0X6A,-0x3c 。 请用等价类划分法设计测试用例。 2、下面是一段求最大值的程序,其中datalist是数据表,n是datalist的长度。 int GetMax(int n, int datalist[ ]) { int k=0; for ( int j=1; j datalist[k] ) k=j; return k; } 画出该程序的程序流程图,并计算其McCabe复杂度。 3、有下列伪码程序: START INPUT (M,N) IF M>=10 THEN X:=10 ELSE X:=l ENDIF IF N>=20 THEN Y:=20 ELSE Y:=2 ENDIF PRINT(X,Y) STOP 设计该程序的语句覆盖和路径覆盖测试用例。 4、根据伪码程序画出程序流程图,盒图(N-S图)。 START a IF x1 THEN REPEAT UNTIL x2 b END REPEAT ELSE BLOCK c d END BLOCK

END IF STOP 5、根据下列描述,画出教材征订系统的第一层数据流图。学生入学后到教材科订书,教材科根据教材库存情况分析是否需要买书,如需购买,则向书店购买。各种资金往来通过学校的会计科办理。 6、画出下列伪码程序的程序流程图,盒图(N-S图)。 START IF p THEN WHILE q DO F END DO ELSE BLOCK g n END BLOCK END IF STOP 7、画出下面PDL伪码程序的程序流程图、N-S图、PAD图和程序流图,并计算其McCabe复杂度。 WHILE P DO IF A>O THEN A1 ELSE A2 ENDIF; IF B>0 THEN B1; IF C>0 THEN C1 ELSE C2 ENDIF ELSE B2 ENDIF; B3 ENDWHILE; 8、根据下面伪码程序,设计语句覆盖、路径覆盖、边覆盖、判定覆盖、条件覆盖、点覆盖的测试用例。 PROCEDURE EX(A,B:REAL;VAR X:REAL); BEGIN IF(A=3)OR(B>1)THEN X:=A×B IF(A>2)AND(B=0)THEN X:=A-3 END 9、某培训中心要研制一个计算机管理系统。它的业务是:将学员发来的信件收集分类后,按几种不同的情况处理。 如果是报名的,则将报名数据送给负责报名事务的职员,他们将查阅课程文件,检查该课程是否额满,然后在学生文件、课程文件上登记,并开出报告单交财务部门,财务人员开出发票给学生。 如果是想注销原来已选修的课程,则由注销人员在课程文件、学生文件和帐目文件上做相应的修改,并给学生注销单。 如果是付款的,则由财务人员在帐目文件上登记,也给学生一收费收据。

后缀数组实现的倍增算法和DC3算法

后缀数组实现的倍增算法和DC3算法 [cpp] view plaincopyprint? /************************************************ 数据结构:后缀数组(Suffix_Array); 子串: 字符串S的子串r[i..j],i≤j,表示r串中从i到j这一段, 也就是顺次排列r[i],r[i+1],...,r[j]形成的字符串; 后缀: 后缀是指从某个位置i开始到整个串末尾结束的一个特殊子串; 字符串r的从第i个字符开始的后缀表示为Suffix(i),也就是Suffix(i)=r[i...len(r)]; 后缀数组SA: 后缀数组保存的是一个字符串的所有后缀的排序结果; 其中SA[i]保存的是字符串所有的后缀中第i小的后缀的开头位置; 名次数组Rank: 名次数组Rank[i]保存的是后缀i在所有后缀中从小到大排列的“名次”; 后缀数组是"排第几的是谁",名次数组是"排第几",即后缀数组和名次数组为互逆运算; (1)倍增算法: 用倍增的方法对每个字符开始的长度为2^k的子字符串进行排序,求出排名,即rank值。k从0开始,每次加1,当2^k大于n以后,每个字符开始的长度为2^k的子字符串便相当于所有的后缀。 并且这些子字符串都一定已经比较出大小,即rank值中没有相同的值,那么此时的rank值就是最后的结果。 每一次排序都利用上次长度为2^k-1的字符串的rank值, 那么长度为2^k的字符串就可以用两个长度为2^k-1的字符串的排名作为关键字表示, 然后进行基数排序,便得出了长度为2^k的字符串的rank值。 (2)DC3算法: ①先将后缀分成两部分,然后对第一部分的后缀排序; ②利用①的结果,对第二部分的后缀排序; ③将①和②的结果合并,即完成对所有后缀排序; 时间复杂度: 倍增算法的时间复杂度为O(nlogn),DC3算法的时间复杂度为O(n); 从常数上看,DC3算法的常数要比倍增算法大; 空间复杂度: 倍增算法和DC3算法的空间复杂度都是O(n); 倍增算法所需数组总大小为6n,DC3算法所需数组总大小为10n; RMQ(Range Minimum/Maximum Query)问题: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),

C语言综合应用实例

C语言综合应用实例 一、学生信息管理系统 #include/*I/O函数*/ #include/*其它说明*/ #include/*字符串函数*/ #defineBUFLEN100/*缓冲区最大字符数*/ #defineLEN15/*学号和姓名最大字符数,实际请更改*/ #defineN100/*最大学生人数,实际请更改*/ structrecord/*结构体*/ { charcode[LEN+1];/*学号*/ charname[LEN+1];/*姓名*/ intage;/*年龄*/ charsex[3];/*性别*/ chartime[LEN+1];/*出生年月*/ charadd[30];/*家庭地址*/ chartel[LEN+1];/*电话号码*/ charmail[30];/*电子邮件地址*/ }stu[N]; intk=1,n,m;/*定义全局变量*/ voidreadfile();/*函数声明*/ voidseek(); voidmodify(); voidinsert(); voiddel(); voiddisplay(); voidsave(); voidmenu(); intmain() { while(k) menu(); system("pause"); return0; } voidhelp() { printf("\n0.欢迎使用系统帮助!\n"); printf("\n1.进入系统后,先刷新学生信息,再查询;\n"); printf("\n2.按照菜单提示键入数字代号;\n");

后缀数组

信息学奥林匹克 China Nation Olympiad in Informatics 国家集训队论文 题目:后缀数组——处理字符串的有力工具作者:罗穗骞 指导教师:张学东 学校:华南师范大学附属中学 完成时间:2009年1月

目录 摘要 (4) 关键字 (4) 正文 (4) 一、后缀数组的实现 (4) 1.1基本定义 (4) 1.2倍增算法 (6) 1.3DC3算法 (9) 1.4倍增算法与DC3算法的比较 (14) 二、后缀数组的应用 (15) 2.1最长公共前缀 (15) 例1:最长公共前缀 (17) 2.2单个字符串的相关问题 (17) 2.2.1重复子串 (18) 例2:可重叠最长重复子串 (18) 例3:不可重叠最长重复子串(pku1743) (18) 例4:可重叠的最长重复子串(pku3261) (19) 2.2.2子串的个数 (19) 例5:不相同的子串的个数(spoj694,spoj705) (19) 2.2.3回文子串 (19) 例6:最长回文子串(ural1297) (20) 2.2.4连续重复子串 (20) 例7:连续重复子串(pku2406) (20) 例8:重复次数最多的连续重复子串(spoj687,pku3693) (21) 2.3两个字符串的相关问题 (21) 2.3.1公共子串 (22) 例9:最长公共子串(pku2774,ural1517) (22) 2.3.2子串的个数 (23)

例10:长度不小于k的公共子串的个数(pku3415) (23) 2.4多个字符串的相关问题 (23) 例11:不小于k个字符串中的最长子串(pku3294) (24) 例12:每个字符串至少出现两次且不重叠的最长子串(spoj220) (24) 例13:出现或反转后出现在每个字符串中的最长子串(pku3294) (24) 三、结束语 (25) 参考文献 (25) 致谢 (25)

数组的综合应用例子

数组的综合应用例子 时间:2009-6-19 8:54:45 点击:1409 数组的综合应用 为了加深对数组的理解,下面结合一些常用算法的编程来更加深入地学习和使用数组。由于一维数组和二维数组是程序设计中最常用的数组形式,因此这里的举例均为一维和二维数组。 1.数组元素的输入和输出 [例5-12] 由用户输入5个数组元素的值并把它们输出在窗体上。 Option Explicit Private Sub Command1_Click() Dim a(1 To 5) As Integer, i As Integer For i=1 To 5 a(i)=InputBox("请输入第" & Str(i) & "个元素") Next For i=1 To 5 Print "a (";i; ")="; a(i) Next End Sub 程序运行后,单击命令按钮,执行事件过程Command1_Click。若输入5个值10,20,30,40,50,则窗体上显示的输出结果是: a(1)=10 a(2)=20 a(3)=30 a(4)=40 a(5)=50 程序中声明了一个具有5个元素的一维整型数组,分别用循环语句输入、输出数组元素的值。在循环体内,数组元素用循环控制变量i作下标,i值的不同就表示数组元素的不同。在程序中引用数组元素时,其下标可以使用表达式。只要表达式的结果不超出数组定义的上界和下界范围,下标表达式就是合法的。例如本例中,若i=2,则: a(i+1)的值为30; a(a(i+3)\10)的值为50。 下标表达式的值还可以是实数,此时VB将自动对其进行四舍五入取整。例如: a(1+0.4)的值是10; a(2+0.5)的值30。 2.数组元素插入删除

腾讯2011笔试题

1、下面的排序算法中,初始数据集的排列顺序对算法的性能无影响的是(B) A、插入排序 B、堆排序 C、冒泡排序 D、快速排序 2、以下关于Cache的叙述中,正确的是(B) A、CPU中的Cache容量应大于CPU之外的Cache容量 B、Cache的设计思想是在合理成本下提高命中率 C、Cache的设计目标是容量尽可能与主存容量相等 D、在容量确定的情况下,替换算法的时间复杂度是影响Cache命中率的关键因素 3、数据存储在磁盘上的排列方式会影响I/O服务的性能,一个圆环的磁道上有10个物理块,10个数据记录R1------R10存放在这个磁道上,记录的安排顺序 如下表所示: 物理块12345678910逻辑记录R1R2R3R4R5R6R7R8R9R10 假设磁盘的旋转速度为20ms/周,磁盘当前处在R1的开头处,若系统顺序扫描后将数据放入单缓冲区内,处理数据的时间为4ms(然后再读取下个记录), 则处理这10个记录的最长时间为(C) A、180ms B、200ms C、204ms D、220ms 2+4+((2+4)+2*8)*9=204 4、随着IP网络的发展,为了节省可分配的注册IP地址,有一些地址被拿出来 用于私有IP地址,以下不属于私有IP地址范围的是(C) A、10.6.207.84 B、172.23.30.28 C、172.32.50.80 D、192.168.1.100 私有IP地址共有三个范围段: A:10.0.0.0~10.255.255.255 /8 B:172.16.0.0~172.31.255.255 /12 C:192.168.0.0~192.168.255.255 /16

综合应用案例—学生信息管理系统(C语言)

14.3综合应用案例—学生信息管理系统 作为学生,同学们最熟悉自己的相关信息了,如果能够设计一个学生信息管理系统,实现全班乃至全校学生信息的管理系统,是非常有实际意义的。同时,开发一个小型的信息管理系统,综合应用我们之前学习的基本语法知识和程序设计方法,将是一个提升和锻炼实践能力的好机会。 1. 主要功能 设计与开发一个学生信息管理系统,对学生的学号、姓名、性别、年龄等基本信息进行管理,实现基本的增、删、改、查等功能。 2. 功能模块设计 通过需求分析,按照结构化程序设计自顶向下,逐步细化的方法,以模块化设计为中心的原则,学生信息管理系统应该具有基本的文件管理、编辑、显示三个功能模块。 文件管理模块包括:加载文件、保存文件、拷贝到目标文件、退出系统; 编辑模块包括:输入记录、查找记录、修改记录、删除记录、插入记录、记录排序; 显示模块包括:显示全部记录、按序号显示记录。 系统的功能划分如图14.12所示: 学生基本信息管理系统 输入学生记录 浏览学生记录 按姓名查找按姓名删除 按学号修改插入学生记录 保存文件加载文件按序号浏览 按姓名排序 拷贝文件文件管理模块编辑模块显示模块 退出系统 图14.12 系统功能模块图 3. 数据结构设计 为了实现学生信息的管理,系统中采用的主要数据结构是结构体数组,为了方便系统功能扩展及编码方便,使用了#define 定义结构体数组上限,并使用typedef 定义结构体类型别名。 #define M 50 typedef struct { char no[20]; char name[20];

char sex[5]; int age; }STUDENTS; STUDENTS stu[M]; 4. 函数及调用关系 函数是模块化的主要手段,系统的各个主要功能都设计成函数,通过各个函数相互调用,并最终由主函数main调用组装成整个软件系统。学生信息管理系统由1个.h头文件和2个.c 源文件组成。程序中除了主函数外,共设计了以下15个函数,以下是这些函数的函数原型及功能设计。 (1)int menu_select(); 函数功能: 在屏幕上显示主菜单,接收用户选择并响应用户相应操作。 (2)int enter(STUDENTS t[]); 函数功能:输入学生记录条数,并循环输入学生基本信息。 (3)void list(STUDENTS t[],int n); 函数功能:按每页10条显示结构体数组中的学生信息。 (4)void search(STUDENTS t[],int n); 函数功能:按给定的姓名查找学生并显示该生信息。 (5)int del(STUDENTS t[],int n); 函数功能:按给定姓名从结构体数组中删除该生信息。 (6)int add(STUDENTS t[],int n); 函数功能:给定学生姓名,查找该生在结构体数组中的位置,从该位置开始后移,将一条新输入的学生信息插入在该位置。 (7)void save(STUDENTS t[],int n); 函数功能:将结构体数组中的学生信息以二进制方式写入到文件。 (8)int load(STUDENTS t[]); 函数功能:将保存的二进制文件加载到内存中的结构体数组。 (9)void display(STUDENTS t[],int n); 函数功能:按输入序号从结构体数组中定位并输出学生信息。 (10)void sort(STUDENTS t[],int n); 函数功能:采用冒泡排序算法,按姓名将结构体数组中的学生从小到大排序。 (11)void copy(); 函数功能:将保存的学生信息拷贝到指定的目标文件中一份。 (12)void print(STUDENTS temp); 函数功能:显示指定的一条学生记录。 (13)int find_name(STUDENTS t[],int n,char *s); 函数功能:在结构体数组中按给定姓名查找学生。 (14)int find_no(STUDENTS t[],int n,char *no); 函数功能: 在结构体数组中按给定学号查找学生。 (15)void modify(STUDENTS t[],int n); 函数功能:按照给定的学号在结构体数组中定位该生,重新输入数据对其进行修改,并显示修改前后的数据进行对比。 程序中总共16个函数之间的调用关系如图14.13所示:

综合应用例题

综合应用例题1、有下列伪码程序: START INPUT(M,N) IFM>=10 THENX:=10 ELSEX:=l ENDIF IFN>=20 THENY:=20 ELSEY:=2 ENDIF PRINT(X,Y) STOP 设计该程序的语句覆盖和路径覆盖测试用例。解: 语句覆盖测试用例为 ①M=9(或=10),N=20(或>=20) 路径覆盖的测试用例为 ①M=9,N=19; ②M=9、N=20;

③M=l0,N=l9; ④M=10,N=20 2、根据伪码程序画出程序流程图、程序流图,并计算其McCabe复杂度。START a IFx1THEN REPEATUNTILx2 b ENDREPEAT ELSE BLOCK c d ENDBLOCK ENDIF STOP 解:(1)程序流程图 T

(2)程序流图:略 McCabe复杂度=3 3、根据下列描述,画出教材征订系统的第一层数据流图。学生入学后到教材科订书,教材科根据教材库存情况分析是否需要买书,如需购买,则向书店购买。各种资金往来通过学校的会计科办理。 解: 4、画出下列伪码程序的程序流程图、程序流图,并计算其McCabe复杂度。START IFpTHEN WHILEqDO F ENDDO ELSE BLOCK g n ENDBLOCK ENDIF STOP 解: 程序流程图: 程序流图:略 McCabe复杂度=3

5.对以下程序进行测试: PROCEDUREEX(A,B:REAL;VARX:REAL); BEGIN IF(A=3)OR(B>1)THENX:=A×B IF(A>2)AND(B=0)THENX:=A-3 END 要求:先画出程序流程图。再按语句覆盖法设计测试数据。 解: 语句覆盖A=3B=0 6、某培训中心要研制一个计算机管理系统。它的业务是:将学员发来的信件收集分类后,按几种不同的情况处理。 如果是报名的,则将报名数据送给负责报名事务的职员,他们将查阅课程文件,检查该课程是否额满,然后在学生文件、课程文件上登记,并开出报告单交财务部门,财务人员开出发票给学生。 如果是想注销原来已选修的课程,则由注销人员在课程文件、学生文件和帐目文件上做相应的修改,并给学生注销单。 如果是付款的,则由财务人员在帐目文件上登记,也给学生一张收费收据。 要求: 1.对以上问题画出数据流程图。 2.画出该培训管理的软件结构图的主图。 解: 7、请使用程序流程图描述在数组A(1)~A(10)中找最大数的算法。 解:

后缀数组的应用

二、后缀数组的应用 本节主要介绍后缀数组在各种类型的字符串问题中的应用。各题的原题请见附件二,参考代码请见附件三。 2.1最长公共前缀 这里先介绍后缀数组的一些性质。

height数组:定义height[i]=suffix(sa[i-1])和suffix(sa[i])的最长公共前缀,也就是排名相邻的两个后缀的最长公共前缀。那么对于j和k,不妨设rank[j]1,如果h[i-1]≤1,原式显然成立)并且suffix(k+1)和suffix(i)的最长公共前缀是

h[i-1]-1,所以suffix(i)和在它前一名的后缀的最长公共前缀至少是h[i-1]-1。按照h[1],h[2],……,h[n]的顺序计算,并利用h数组的性质,时间复杂度可以降为O(n)。 具体实现: 实现的时候其实没有必要保存h数组,只须按照h[1],h[2],……,h[n]的顺序计算即可。代码: int rank[maxn], height[maxn] void getHeight(){ int i, j, k=0; for (i=0; i

软件工程综合应用例题

软件工程综合应用例题 第一部分《结构化软件开发方法》 1、根据下列描述,画出教材征订系统的第一层数据流图。学生入学后到教材科订书,教材科根据教材库存情况分析是否需要买书,如需购买,则向书店购买。各种资金往来通过学校的会计科办理。 解: 教材库存 收 应 学生书店 P1 教材科 P2 会计 订书订书 发书发书 F1 款 通 知 付 款 通 知 2、高考录取统分子系统有如下功能: (1) 计算标准分:根据考生原始分计算,得到标准分,存入考生分数文件; (2) 计算录取线分:根据标准分、招生计划文件中的招生人数,计算录取线,存入录取线文件。 试根据要求画出该系统的数据流程图,并将其转换为软件结构图。 解:(1)数据流图:(2)软件结构图: ①原始分②标准分③招生计划④录取线 3、有下列伪码程序: START INPUT (M,N) IF M>=10 THEN X:=10 ELSE X:=l ENDIF

IF N>=20 THEN Y:=20 ELSE Y:=2 ENDIF PRINT(X,Y) STOP 设计该程序的语句覆盖和路径覆盖测试用例。 解: 语句覆盖测试用例为 ①M=9(或=10),N=20(或>=20) 路径覆盖的测试用例为 ①M=9,N=19; ②M=9、N=20; ③M=l0,N=l9; ④M=10,N=20 4、画出下列伪码程序的程序流程图、盒图(N-S 图)、PAD 图。 START IF p THEN WHILE q DO F END DO ELSE BLOCK g n END BLOCK END IF STOP 解: START q p g n F STOP T F T F 5、根据下面程序流程图,给出测试用例:

后缀数组

OI笔记]后缀数组学习笔记--后缀数组解题方法总结 2010-04-15 07:37 后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也并不逊色,而且它比后缀树所占用的内存空间小很多。可以说,后缀数组比后缀树要更为实用。自从拜读了罗穗骞大牛的WC2009论文《后缀数组——处理字符串的有力工具》后,经过若干星期的努力(中间有因某些原因而缓下来),终于把论文上面的练习题全部完成了,现在写写自己对后缀数组的理解和感悟。在看本笔记时,请不要忘记了,这是笔记,而教材是《后缀数组——处理字符串的有力工具》。 一:后缀数组的实现 1、定义:Suffix Array数组(SA数组)用于保存从小到大排好序之后的后缀。RANK名次数组用来保存后缀S[i..n]在所有后缀中是第几小的后缀。简单来说,SA数组表示的是“排第几的是谁”,RANK数组表示的是“你的排名是多少”。 2、求SA数组以及RANK数组的方法:详细的请转到罗穗骞大牛的论文,我的学习笔记重点不是要介绍这个。 3、对DA(倍增算法)的一些个人理解:由于我只学习了倍增算法,所以我只能谈谈我对它的理解。DC3算法我没有去研究.... DA算法我是根据罗穗骞的模板写的,根据自己的理解做了些许的小优化。我们现在来看看罗穗骞大牛的模板: int wa[maxn],wb[maxn],wv[maxn],ws[maxn]; 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=0;i--) sa[--ws[x[i]]]=i; for(j=1,p=1;p=j) y[p++]=sa[i]-j; for(i=0;i=0;i--) sa[--ws[wv[i]]]=y[i]; for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i

综合应用实例

综合使用实例 实现一个简单的学生成绩录入和查询系统。具体要求如下: (1)能够输入学生的学号、姓名和各科成绩。 (2)根据输入的学号,查询并计算出该生的各科成绩及平均分。 (3)根据输入的课程代号,查询并计算出该课程中每个学生的成绩及课程平均分。 (4)查询所有课程中成绩不及格的学生名单及相应成绩。 程序分析:学生成绩用文本文件来存储,能够从文本文件里读出学生的信息,也能够向文本文件中写入学生的信息。程序中对插入和提取运算符进行了重载。程序依次有5项功能:学生信息的添加;输入学号,输出该生各科成绩及平均分;输入课程代号,输出该课程每位学生成绩及课程平均分;输入学生姓名,输出成绩;设计功能选择菜单及利用switch —case 语句实现以上功能。程序如下: #include #include #include #include #include int count; //学生人数 class Student //学生类定义 { private: char Name[20]; //姓名 char Number[20]; //学号 double Chinese,Math,English,Computer; //语文,数学,英语,计算机成绩public: Student(){} char *getname() {return Name;} double getscore(char n) { double score; switch(n) { case 'c': score=Chinese; break; case 'm': score=Math; break; case 'e': score=English; break; case 'p': score=Computer; break; } return score; } char *getNumber() { return Number;

综合应用例题

综合应用例题 1、有下列伪码程序: START INPUT (M,N) IF M>=10 THEN X:=10 ELSE X:=l ENDIF IF N>=20 THEN Y:=20 ELSE Y:=2 ENDIF PRINT(X,Y) STOP 设计该程序的语句覆盖和路径覆盖测试用例。 解: 语句覆盖测试用例为 ①M=9(或=10),N=20(或>=20) 路径覆盖的测试用例为 ①M=9,N=19; ②M=9、N=20; ③M=l0,N=l9; ④M=10,N=20 2、根据伪码程序画出程序流程图、程序流图,并计算其McCabe复杂度。 START a IF x1 THEN REPEAT UNTIL x2 b END REPEAT ELSE BLOCK c d END BLOCK END IF STOP 解:(1) 程序流程图

T (2) 程序流图:略 McCabe复杂度=3 3、根据下列描述,画出教材征订系统的第一层数据流图。学生入学后到教材科订书,教材科根据教材库存情况分析是否需要买书,如需购买,则向书店购买。各种资金往来通过学校的会计科办理。 解: 4、画出下列伪码程序的程序流程图、程序流图,并计算其McCabe复杂度。 START IF p THEN WHILE q DO F END DO ELSE BLOCK g n END BLOCK END IF STOP 解: 程序流程图:

程序流图:略 McCabe复杂度=3 5. 对以下程序进行测试: PROCEDURE EX(A,B:REAL;VAR X:REAL); BEGIN IF(A=3)OR(B> 1)THEN X:=A×B IF(A>2)AND(B=0)THEN X:=A-3 END 要求:先画出程序流程图。再按语句覆盖法设计测试数据。 解: 语句覆盖A=3 B=0 6、某培训中心要研制一个计算机管理系统。它的业务是:将学员发来的信件收集分类后,按几种不同的情况处理。 如果是报名的,则将报名数据送给负责报名事务的职员,他们将查阅课程文件,检查该课程是否额满,然后在学生文件、课程文件上登记,并开出报告单交财务部门,财务人员开出发票给学生。 如果是想注销原来已选修的课程,则由注销人员在课程文件、学生文件和帐目文件上做相应的修改,并给学生注销单。 如果是付款的,则由财务人员在帐目文件上登记,也给学生一收费收据。

Pku1743 Musical Theme详细解题报告后缀数组求不重叠的最长重复子串

Pku1743 Musical Theme /* Name: pku1743 Copyright: ecjtu_acm Author: yimao Date: 16/02/11 13:35 Description: 二分答案, 后缀数组求不重叠的最长重复子串 */ 一、题目 Description A musical melody is represented as a sequence of N (1<=N<=20000)notes that are integers in the range 1..88, each representing a key on the piano. It is unfortunate but true that this representation of melodies ignores the notion of musical timing; but, this programming task is about notes and not timings. Many composers structure their music around a repeating &qout;theme&qout;, which, being a subsequence of an entire melody, is a sequence of integers in our representation. A subsequence of a melody is a theme if it: ?is at least five notes long ?appears (potentially transposed -- see below) again somewhere else in the piece of music ?is disjoint from (i.e., non-overlapping with) at least one of its other appearance(s) Transposed means that a constant positive or negative value is added to every note value in the theme subsequence. Given a melody, compute the length (number of notes) of the longest theme. One second time limit for this problem's solutions!

后缀数组题型讲解

后缀数组、不重复子串Distinct Substrings 题目大意:给出一个字符串,问它的不重复子串有多少个。两题是一样的,除了字符串长度.. 分析:用后缀数组可以轻松解决。因为这个字符串的每个子串必然是某个后缀的前缀,先用后缀数组求出sa和height,那么对于sa[k],它有n-sa[k]个子串,其中有height[k]个是和上一个后缀重复的,所以要减去。所以用后缀数组求解的时间复杂度是O(n),后缀数组要是用倍增算法是O(nlog2n),效率很高。 note:wa了一次,主要原因是忘了a[n]=0这个关键的初值... PS:各位大牛对我的差劲的c++代码有什么看法可以尽管喷哈! codes: #include #include using namespace std; const long maxn=1010; long wn[maxn],wa[maxn],wb[maxn],wv[maxn],a[maxn],sa[maxn],rank[maxn],height[maxn]; char r[maxn]; long cmp(long *r,long a,long b,long l){ return r[a]==r[b]&&r[a+l]==r[b+l]; } void da(long *r,long *sa,long n,long m){ long i,j,p,*x=wa,*y=wb,*t; for (i=0;i=0;i--) sa[--wn[x[i]]]=i; for (p=1,j=1;p=j) y[p++]=sa[i]-j; for (i=0;i=0;i--) sa[--wn[wv[i]]]=y[i]; for (t=x,x=y,y=t,x[sa[0]]=0,p=1,i=1;i

亚马逊面试题目

亚马逊面试题 1.算法题:一个股价序列,告诉每个时间点的股价,问什么时候买什么时候卖获利最大?时间复杂度O(n) 2.(1)有0,1,2到99这100个正整数,中间丢失了一个,剩余的99个数打乱顺序放在一个数组里, 问怎样找到丢失的那个数。 直接说了一个时间空间复杂度都为O(n)的算法(瞬秒),能把空间复杂度优化到O(1)的 (2)有一个有序的环形数列,从小到大排好了,比如:4,5,6,1,2,3,从第四个位置开始当成环形看,就是一个有序数列1,2,3,4,5,6。问题是在这个数列中找到给定的关键字。 我想到了用二分找到这个环形的开头位置i,那么[0,i],[i+1,n-1]就是有序的,再次做二分即可。 对方说能想到lgn的复杂度很好,但是希望能够只要一次二分就完成。 1.英文自我介绍加一个英文问答:Why Amazon? 2.基础知识:数组、链表、map的区别和用法 3.最长公共子序列(动态规划,时空复杂度都是O(n^2))可以把空间复杂度降到O(n),后缀数组(数据结构) 4.电影院售票系统设计:面向对象思想设计 5.股价题,空间复杂度优化到O(1) 6.给一个n行m列的矩阵框,每个格点放着若干大米,小鸡从左下角点出发,只能往右或者往上走, 问小鸡最多能吃掉多少大米。很简单的动态规划,瞬秒。然后他又和我讨论了优化空间复杂度的问题,我说可以从O(n^2)优化到O(n)的,对方表示满意。 第三轮是面试官和我讨论一个open question,这个题目感觉很有意思:给一个图片,这个图片是由n*m个小图片拼成的, 它的色调是左上角最浅,越往右下角色调越深。问我有没有什么办法做出这样的图片。 我的想法是对这n*m个小图片的色调从浅到深排序,然后斜着从小到大填充这个大矩形。 1 2 4 3 5 7 6 8 9 对色调排序是把每个小图片的RGB三个值(范围0~255)做统计,最后去掉个数过少的然后做加权平均, 哈希出每个小图片的色调值然后再排序即可(没有标答,你可以自己定义规则,只要合理就行)。 一边讨论一边让我把自己定义的数据结构、怎样找每个小图片的哈希值、怎样填充大矩形的代码写了下来。 //////////////////////////////////////////////////////////////// 1、有一个2G的文件,如果只有300m内存,应该怎么反置文件? 2、如何在内存中快速从2亿QQ用户中通过号码快速得到用户的信息? 3、很多用户进行查询和更新用户信息的操作怎么办? 4、同时有10W个连接请求,该如何处理?

回文字符串

Manacher算法:求解最长回文字符串,时间复杂度为O(N)回文串定义:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是 回文串。回文子串,顾名思义,即字符串中满足回文性质的子串。 经常有一些题目围绕回文子串进行讨论,比如POJ3974最长回文,求最长回文子串的长度。朴素算法是依次以每一个字符为中心向两侧进行扩展,显然这个复杂度是O(N^2)的,关于字符串的题目常用的算法有KMP、后缀数组、AC 自动机,这道题目利用扩展KMP可以解答,其时间复杂度也很快O(N*logN)。但是,今天笔者介绍一个专门针对回文子串的算 法,其时间复杂度为O(n),这就是manacher 算法。 大家都知道,求回文串时需要判断其奇偶性,也就是求aba 和abba 的算法略有差距。然而,这个算法做了一个简单的处理,很巧妙地把奇数长度回文串与偶数长度回文串统一考虑,也就是在每个相邻的字符之间插入一个分隔符,串的首尾也要加,当然这个分隔符不能再原串中出现,一般可以用…#?或者…$?等字符。例如: 原串:abaab 新串:#a#b#a#a#b# 这样一来,原来的奇数长度回文串还是奇数长度,偶数长度的也变成以…#?为中心奇数回文串了。 接下来就是算法的中心思想,用一个辅助数组P 记录以每个字符为中心的最长回文半径,也就是P[i]记录以Str[i]字符为中心的最长回文串半径。P[i]最小为1,此时回文串为Str[i]本身。 我们可以对上述例子写出其P 数组,如下 新串:# a # b # a # a # b # P[] : 1 2 1 4 1 2 5 2 1 2 1 我们可以证明P[i]-1 就是以Str[i]为中心的回文串在原串当中的长度。 证明: 1、显然L=2*P[i]-1 即为新串中以Str[i]为中心最长回文串长度。 2、以Str[i]为中心的回文串一定是以#开头和结尾的,例如“#b#b#”或“#b#a#b#”所以L 减去最前或者最后的…#?字符就是原串中长度的二倍,即原串长度为(L-1)/2,化简的P[i]-1。得证。依次从前往后求得P 数组就可以了,这里用到了DP(动态规划)的思想,也就是求P[i] 的时候,前面的P[]值已经得到了,我们利用回文串的特殊性质可以进行一个大大的优化。 先把核心代码贴上: for (i = 0; i < len; i++){ if (maxid > i){ p[i] = min(p[2*id - i], maxid - i); } else{ p[i] = 1; } while (newstr[i+p[i]] == newstr[i-p[i]]) p[i]++; if (p[i] + i > maxid){ maxid = p[i] + i;

相关文档
最新文档