Problem D: String
Description
给定一个字符串S[1..n]和一个整数T,现在需要在字符串S中找出长度不小于T的一个子串,使得其在原串中不重叠出现的次数最多,求这个次数。
Input
第一行:一个整数T(T > 1)
第二行:一个字符串S,且仅包含小写字母,字符串长度不超过10000
Output
一个整数。代表出现最多的次数
如果没有满足条件的解则输出0
Sample Input
2
ababab
Sample Output
3
类似最大重复子串,可以用后缀数组+贪心或者后缀树。由于这题数据量比较小,直接枚举。
#include <iostream>
const int N = 10001;
int t,len;
char str[N];
int query(int from,int to){
int i=0,j,k,ans=0;
while(i<len){
for(j=i,k=from;j<len && k<=to;j++,k++)
if(str[j]!=str[k])
break;
if(k>to)
ans++,i=j;
else
i++;
}
return ans;
}
int solve(){
int i,j,ans=0,n;
if(t>len) return 0;
for(i=0,j=t-1;j<len;i++,j++)
if((n=query(i,j))>ans)
ans=n;
return (ans==1)? 0:ans;
}
int main(){
while(scanf("%d",&t)!=EOF){
scanf("%s",str);
len=strlen(str);
printf("%d\n",solve());
}
return 0;
}