问题描述
给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
第一行一个数字L。
第二行是字符串S。
L大于0,且不超过S的长度。
第二行是字符串S。
L大于0,且不超过S的长度。
输出格式
一行,题目要求的字符串。
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
数据规模和约定
n<=60
S中所有字符都是小写英文字母。
S中所有字符都是小写英文字母。
提示
枚举所有可能的子串,统计出现次数,找出符合条件的那个
AC Code
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <queue>
#define inf 0x3f3f3f3f
#define maxn 7003
#define MOD 10
using namespace std;
const double pi=3.141592653589793239,ee=2.7182818284590452354;
char str[100],ans[50],t[50];
int e,maxx=0,next[50];
void kmp(int len)
{
int i=0,j=-1;
next[i]=j;
while(i<len)
{
if(j==-1||t[i]==t[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
int pd(int len)
{
kmp(len);
int i=0,j=0,sum=0;
while(i<e)
{
if(j==len)
{
j=next[j];
sum++;
}
if(j==-1||str[i]==t[j])
{
i++;
j++;
}
else
j=next[j];
}
return sum;
}
int main(int argc, char** argv) {
int n,i,j,k;
cin>>n>>str;
e=strlen(str);
for(i=0;i<e;i++)
for(j=e-1;j>=i+n-1;j--)
{
for(k=0;k<=j-i;k++)
t[k]=str[k+i];
t[k]='\0';
int tmp=pd(strlen(t));
if(tmp>maxx)
{
maxx=tmp;
for(k=0;k<=strlen(t);k++)
ans[k]=t[k];
}
}
cout<<ans<<endl;
return 0;
}