1.
问题 H: 崩溃的oj
时间限制: 1 Sec 内存限制: 128 MB
提交: 211 解决: 96
[提交][状态][讨论版]
题目描述
你们总说
oj崩了
oj又打不开了
但是你们有考虑过
oj也很辛苦了吗
oj也很累啊
你们没有
你们只想着你们自己
你们只想着交作业
//貌似没毛病,剧情反转
言归正传,不讲段子了,oj最近经常崩溃,他能怎么办,他也很无奈啊,他试图向外界发送着一条包含
了错误信息由大小写英文字母组成的代码,凑巧的是plyjdz学长收到了这一条消息,他试图破解这条信
息,然而他发现由于网络原因,其中核心部分出现次数最多,但是比较懒的皮卡丘表示并不想筛选出核
心代码,于是他决定把这个任务交给学弟学妹们。
输入
一个字符串由且仅由大小写英文字母组成,长度不超过360。
输出
输出分为两行
第一行输出核心字段即出现次数最多的字符子串(子串长度大于等于2)
第二行输出该字段出现的次数
样例输入
emmmmmemmm
样例输出
mm
6
分析题意:
找字符串中出现次数最多的子字符串,
如果有多个出现次数最多的字符子串,输出最长的一个,如果最长的有多个,输出最先出现的。
暴力破解
:二重循环,由首和尾字符确定一个字符串(尾字符下标一定大于首字符的)
三重循环移动查找,四重循环确定查找的字符串相同。
#include <iostream> #include <cstring> using namespace std; int main() { char a[361],b[361]; cin>>a; int len=strlen(a); int maxnum=0,num; int maxlen=0; for(int i=0;i<=len-2;i++) //i指向字符串头部 { for(int j=i+1;j<=len-1;j++) //j指向字符串尾部 { num=1; // i,j确定一个字符串 for(int l=1;l+j<=len-1;l++) { //向右遍历同长度的字符串:l表示移动的位数,k表示字符串的每一位 int k; for(k=i;k<=j;k++) { //!!!!!技巧在于每一位的下标表示及循环的指针表示上!!!! if(a[i+k-i]!=a[i+l+k-i]) break; } if(k==j+1) //for循环到末尾 ,会加一。 num++; } if(num>maxnum) { maxnum=num; maxlen=j-i; for(int p=i;p<=j;p++) b[p-i]=a[p]; //不应刻意去计算头和尾 } if(num==maxnum) { if(j-i>maxlen) { maxlen=j-i; for(int k=i;k<=j;k++) b[k-i]=a[k]; } } } } for(int i=0;i<=maxlen;i++) cout<<b[i]; cout<<endl; cout<<maxnum<<endl; return 0; }