时间限制: 1Sec 内存限制: 128MB 提交: 28 解决: 8
题目描述
给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
数据规模和约定
n< =60
S中所有字符都是小写英文字母。
提示
枚举所有可能的子串,统计出现次数,找出符合条件的那个
输入
第一行一个数字L。
第二行是字符串S。
L大于0,且不超过S的长度。
输出
一行,题目要求的字符串。
样例输入
4 bbaabbaaaaa
样例输出
bbaa
#include<bits/stdc++.h>
using namespace std;
char ss[70],now[70];
struct node
{
char s[70];
int cnt;
int len;
}a[2000];
bool cmp(node a,node b)
{
if (a.cnt!=b.cnt)
return a.cnt > b.cnt;
return a.len > b.len;
}
int main()
{
freopen("in.txt","r",stdin);
int n;
int flg = 0,num = 0;//num存储一共有几种子串
scanf("%d %s",&n,ss);
int len = strlen(ss);
while (n<=len)//统计长度大于等于L的出现次数最多的子串
{
for (int i=0;i<len-n;i++)
{//总串长len,子串长度为n的共有len-n个
int k = 0;
for (int j=i;j<i+n;j++,k++)
{
now[k] = ss[j];//设置一个临时数组预存子串
}
now[k] = '\0';
flg = 1;
for (int j=0;j<num;j++)
{
if (strcmp(a[j].s,now)==0)
{
flg = 0;
a[j].cnt++;//如果存在相同子串,则该字串数目+1
}
}
if (flg)//否则将其作为新的子串加入其中
{
strcpy(a[num].s,now);
a[num].cnt++;
a[num].len = k;
num++;
}
}
memset(now,0,sizeof(now));
n++;
}
sort(a,a+num,cmp);
printf("%s\n",a[0].s);
return 0;
}