参考答案看底部
1.求改进的失败函数nextval[j]
题目描述
在KMP算法中,进行模式匹配,在匹配失败时,主串的位置i不回溯,模式串需要根据改进的失败函数nextval[j]的值,j转移到nextval[j]位置继续进行比较。试设计函数求模式串的改进的失败函数nextval[j]。
输入描述
输入模式串
输出描述
输出模式串的改进的失败函数nextval[j]
样例输入
aaaaab
样例输出
-1-1-1-1-14
2. 求模式串的失败函数next[j]
题目描述
在KMP算法中,进行模式匹配,在匹配失败时,主串的位置i不回溯,模式串需要根据失败函数next[j]的值,j转移到next[j]位置继续进行比较。试设计函数求模式串的next[j]。
输入描述
输入模式串。
输出描述
输出模式串的失败函数。
样例输入
abcabcaabbc
样例输出
-10001234120
3. 数据结构【稀疏矩阵】三元组表示的稀疏矩阵的快速转置
题目描述
编写函数实现三元组表示的稀疏矩阵的快速转置
前置代码:
//算法4.3 三元组表示的稀疏矩阵的快速转置
#include
using namespace std;
#define MaxSize 100
typedef int ElemType;
//三元组结构体
typedef struct
{
int row,col; //行、列
ElemType value; //值
}Triple;
//稀疏矩阵的三元组表示
typedef struct
{
int Rows, Cols, Terms; //行数、列数、非零元素个数
Triple *data;
}SparseMatrix;
//稀疏矩阵三元组表示初始化
void InitSMatrix (SparseMatrix &Sm,int Rw, int Cl)
{
Sm.Rows = Rw;
Sm.Cols = Cl;
Sm.Terms = 0;
Sm.data = new Triple[MaxSize]; //三元组表
};
void CreateSMatrix(SparseMatrix &A) //建立三元组表示的稀疏矩阵
{
int i,m,n;
ElemType e;
//cout<<“请输入矩阵的非零元素个数:”<<endl;
cin>>A.Terms;
for(i = 0; i<A.Terms; i++)
{
//cout<<“请按行序输入第”<<i+1<<“个非零元素的行,列,元素值:(以空格隔开)”<<endl;
cin>>m>>n>>e;
A.data[i].row = m; //行下标
A.data[i].col = n; //列下标
A.data[i].value = e; //该下标所对应的值
}
}
void PrintSMatrix(SparseMatrix A)
{
int i;
//cout<<“行,列,非零元素个数为:”;
cout<<A.Rows<<" “<<A.Cols<<” “<<A.Terms<<endl;
//cout<<“稀疏矩阵的三元组表示为:”<<endl;
for(i=0;i<A.Terms;i++)
cout<<A.data[i].row<<” “<<A.data[i].col<<” "<<A.data[i].value<<endl;
}
void
FastTranspos(SparseMatrix A, SparseMatrix &C); //转置结果在C中
int main(int argc, const char * argv[]) {
SparseMatrix A,C;
int Rows,Cols;
//cout<<“请输入矩阵的总行数:”<<endl;
cin>>Rows;
//cout<<“请输入矩阵的总列数:”<<endl;
cin>>Cols;
InitSMatrix(A,Rows,Cols);//初始化
InitSMatrix(C,Cols,Rows);//初始化
CreateSMatrix(A);//输入稀疏矩阵
FastTranspos(A, C);
PrintSMatrix(C);//输出稀疏矩阵
return 0;
}
输入描述
输入矩阵的总行数、总列数(以空格隔开):
输入矩阵的非零元素个数:
请按行序输入第"<<i+1<<"个非零元素的行,列,元素值:(以空格隔开)
输出描述
行,列,非零元素个数为:
稀疏矩阵的三元组表示为:
样例输入
3
4
3
0 1 5
1 2 2
2 1 6
样例输出
4 3 3
1 0 5
1 2 6
2 1 2
4. 数据结构【稀疏矩阵】三元组表示的稀疏矩阵的转置
题目描述
编写函数实现三元组表示的稀疏矩阵的转置
前置代码:
//算法4.2 三元组表示的稀疏矩阵的转置
#include
using namespace std;
#define MaxSize 100
typedef int ElemType;
//三元组结构体
typedef struct
{
int row,col; //行、列
ElemType value; //值
}Triple;
//稀疏矩阵的三元组表示
typedef struct
{
int Rows, Cols, Terms; //行数、列数、非零元素个数
Triple *data;
}SparseMatrix;
//稀疏矩阵三元组表示初始化
void InitSMatrix (SparseMatrix &Sm,int Rw, int Cl)
{
Sm.Rows = Rw;
Sm.Cols = Cl;
Sm.Terms = 0;
Sm.data = new Triple[MaxSize]; //三元组表
};
void CreateSMatrix(SparseMatrix &A) //建立三元组表示的稀疏矩阵
{
int i,m,n;
ElemType e;
//cout<<“请输入矩阵的非零元素个数:”<<endl;
cin>>A.Terms;
for(i = 0; i<A.Terms; i++)
{
//cout<<“请按行序输入第”<<i+1<<“个非零元素的行,列,元素值:(以空格隔开)”<<endl;
cin>>m>>n>>e;
A.data[i].row = m; //行下标
A.data[i].col = n; //列下标
A.data[i].value = e; //该下标所对应的值
}
}
void PrintSMatrix(SparseMatrix A)
{
int i;
//cout<<“行,列,非零元素个数为:”;
cout<<A.Rows<<" “<<A.Cols<<” “<<A.Terms<<endl;
//cout<<“稀疏矩阵的三元组表示为:”<<endl;
for(i=0;i<A.Terms;i++)
cout<<A.data[i].row<<” “<<A.data[i].col<<” "<<A.data[i].value<<endl;
}
void Transpose (SparseMatrix A, SparseMatrix &B); //转置结果在Bmatrix中
int main(int argc, const char * argv[]) {
SparseMatrix A,B;
int Rows,Cols;
//cout<<“请输入矩阵的总行数:”<<endl;
cin>>Rows;
//cout<<“请输入矩阵的总列数:”<<endl;
cin>>Cols;
InitSMatrix(A,Rows,Cols);//初始化
InitSMatrix(B,Cols,Rows);//初始化
CreateSMatrix(A);//输入稀疏矩阵
Transpose (A, B);
PrintSMatrix(B);//输出稀疏矩阵
return 0;
}
输入描述
输入矩阵的总行数、总列数(以空格隔开):
输入矩阵的非零元素个数:
请按行序输入第"<<i+1<<"个非零元素的行,列,元素值:(以空格隔开)
输出描述
cout<<"行,列,非零元素个数为:
稀疏矩阵的三元组表示为:
样例输入
3
4
3
0 1 5
1 2 2
2 1 6
样例输出
4 3 3
1 0 5
1 2 6
2 1 2
5. 数据结构【稀疏矩阵】建立三元组表示的稀疏矩阵
题目描述
编写函数实现建立三元组表示的稀疏矩阵
前置代码:
//算法4.1 建立三元组表示的稀疏矩阵
#include
using namespace std;
#define MaxSize 100
typedef int ElemType;
//三元组结构体
typedef struct
{
int row,col; //行、列
ElemType value; //值
}Triple;
//稀疏矩阵的三元组表示
typedef struct
{
int Rows, Cols, Terms; //行数、列数、非零元素个数
Triple *data;
}SparseMatrix;
//稀疏矩阵三元组表示初始化
void InitSMatrix (SparseMatrix &Sm,int Rw, int Cl)
{
Sm.Rows = Rw;
Sm.Cols = Cl;
Sm.Terms = 0;
Sm.data = new Triple[MaxSize]; //三元组表
};
void CreateSMatrix(SparseMatrix &A); //建立三元组表示的稀疏矩阵
void PrintSMatrix(SparseMatrix A)
{
int i;
//cout<<“行,列,非零元素个数为:”;
cout<<A.Rows<<" “<<A.Cols<<” “<<A.Terms<<endl;
//cout<<“稀疏矩阵的三元组表示为:”<<endl;
for(i=0;i<A.Terms;i++)
cout<<A.data[i].row<<” “<<A.data[i].col<<” "<<A.data[i].value<<endl;
}
int main(int argc, const char * argv[]) {
SparseMatrix A;
int Rows,Cols;
//cout<<“请输入矩阵的总行数:”<<endl;
cin>>Rows;
//cout<<“请输入矩阵的总列数:”<<endl;
cin>>Cols;
InitSMatrix(A,Rows,Cols);//初始化
CreateSMatrix(A);//输入稀疏矩阵
PrintSMatrix(A);//输出稀疏矩阵
return 0;
}
输入描述
请输入矩阵的总行数:
请输入矩阵的总列数:
请输入矩阵的非零元素个数:
请按行序输入第1个非零元素的行,列,元素值(以空格隔开):
请按行序输入第2个非零元素的行,列,元素值(以空格隔开):
请按行序输入第3个非零元素的行,列,元素值(以空格隔开):
输出描述
输出稀疏矩阵的总行数、总列数、非零元素个数
三元组表示的稀疏矩阵
样例输入
3
4
3
0 1 5
1 2 2
2 1 6
样例输出
3 4 3
0 1 5
1 2 2
2 1 6
提示
稀疏矩阵为:
0 5 0 0
0 0 2 0
0 6 0 0
参考答案
- 求改进的失败函数nextval[j]
#include<iostream>
using namespace std;
void get_next(string T,int next[]);
int main(){
string t;
cin>>t;
int m=t.length();
int n[m];
get_next(t,n);
return 0;
}
void get_next(string T,int next[]){
int m=T.length();
int j=-1;
next[0]=-1;
for(int i=0;i<m;){
if(j==-1||T[i]==T[j]){
++i;
++j;
if(T[i]!=T[j])
next