解题思路:通过第一层循环将串分为1-n个子窜的n/2种不同情况,通过2,3,4层循环将sum个子串记录下来,判断后面的第sum+1个子串与前面的sum各子串相比较是否等价,判断结束后记录子窜个数和对应的K值通过于max比较记录当前最大不同子串的K值;反回一层循环继续执行

注意事项:循环设计层数较多且每个循环涉及多个变量,时间效率较低

参考代码:

#include <iostream>

using namespace std; 

void jisuan(int *x){

int max=0;//记录最大K 

int mark=0;//判断是否与前面的子串相等价 

int l=0;

int a;

cin>>a; 

int *p=new int[a/2];//存储最大子串数对应的K值 

x=new int[a];

for(int n=0;n<a;n++) cin>>x[n];

for(int j=1;j<=a/2;j++){

int sum=1;//记录不同的子串数 

for(int i=j;i+j<=a;i+=j){//向后移动进行比较 

for(int s=1;s<=i/j;s++){//与前面s个子窜相比较 

     mark=0;

for(int f=1,k=i;f<=j;f++,k++){//正向判定字串与子串见是否等价 

if(x[k]!=x[k-j*s]) {

mark=1;

break;

}

}

if(mark==1){

for(int F=1,K=i,n=1;n<=j;F+=2,K++,n++){//判定子串是否反转等价 

if(x[K]!=x[K-j*(s-1)-F]){

mark=2;

break;

}

}

if(mark==1) mark=0;

}

if(mark==0) break;

}

if(mark==1||mark==2) sum++;

mark=0;

}

if(sum>max){

max=sum;

l=1;

p[l-1]=j;

}

else if(sum==max){

l++;

p[l-1]=j;

}

}

cout<<max<<' '<<l<<endl;

for(int v=0;v<l;v++) cout<<p[v]<<' ';

int main(int argc, char** argv) {

int *p;

jisuan(p);

return 0;



点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论