字串统计 kmp算法

来源:互联网 发布:js trigger 参数 编辑:程序博客网 时间:2024/04/28 05:26
问题描述
  给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
  第一行一个数字L。
  第二行是字符串S。
  L大于0,且不超过S的长度。
输出格式
  一行,题目要求的字符串。

  输入样例1:
  4
  bbaabbaaaaa

  输出样例1:
  bbaa

  输入样例2:
  2
  bbaabbaaaaa

  输出样例2:
  aa
数据规模和约定
  n<=60
  S中所有字符都是小写英文字母。

#include<stdio.h>#include<string.h>int next[100];void setnext(char str1[]){int i,j,k;int n;memset(next,0,sizeof(next));n=strlen(str1);i=0,j=-1;next[0]=-1;for(;i<n;){if(j==-1||str1[i]==str1[j]){i++;j++;if(str1[i]!=str1[j]){next[i]=j;} elsenext[i]=next[j];}elsej=next[j];}}int Kmp(char str1[],char str[]){setnext(str1);int len,len1;int i,j,k;i=0,j=0;int sum=0;len=strlen(str);len1=strlen(str1);for(;i<len;){if(j==-1||str[i]==str1[j]){i++;j++;}elsej=next[j];if(j==len1)sum++;}return sum;}int main(){int n;while(~scanf("%d",&n)){int i,j,k,l=0;int m;char str[100];char str1[100];getchar();gets(str);m=strlen(str);char s[100];int max=0,num;for(;n<m;n++){for(i=0;i<=m-n;i++){k=0;for(j=0;j<n;j++){str1[k++]=str[i+j];}l++;str1[k]='\0';num=Kmp(str1,str);if(num>max){max=num;strcpy(s,str1);}else if(num==max){if(strlen(s)<strlen(str1))strcpy(s,str1);}}}printf("%s\n",s);}return 0;}


0 0