解题思路:通过第一层循环将串分为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分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复