蓝桥杯 算法训练 字串统计

来源:互联网 发布:下载刷枪软件 编辑:程序博客网 时间:2024/06/10 06:11
  算法训练 字串统计  
时间限制:1.0s   内存限制:512.0MB
    
问题描述
  给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
  第一行一个数字L。
  第二行是字符串S。
  L大于0,且不超过S的长度。
输出格式
  一行,题目要求的字符串。

  输入样例1:
  4
  bbaabbaaaaa

  输出样例1:
  bbaa

  输入样例2:
  2
  bbaabbaaaaa

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

  提示
  枚举所有可能的子串,统计出现次数,找出符合条件的那个

一看到是字符串匹配问题,立马想起使用KMP,就是总是不对,后来发现KMP的使用有些问题,就这进行了修改之后,还是不能AC。唉,细心方能行的万年船啊,就是因为没有将(出现的字串可以交叉)这句话,直接导致OVER...,经过再次对KMP进行修改,顺利AC!


[objc] view plain copy
  1. #include<stdio.h>  
  2. #include<string.h>  
  3. int len;  
  4. int n;  
  5. int next[10010];  
  6. char mod[61];  
  7. char re[61];  
  8. char ss[1000];  
  9. void get_next(char mod[])  
  10. {  int i,j;  
  11.    i=0;next[0]=-1;j=-1;  
  12.  while(i<n)  
  13.  {  
  14.     if(j==-1||mod[i]==mod[j])  
  15.     {  
  16.         ++i;++j;  
  17.         if(mod[i]==mod[j])  
  18.            next[i]=next[j];  
  19.         else  
  20.            next[i]=j;  
  21.     }  
  22.     else  
  23.     j=next[j];  
  24.  }  
  25. }  
  26. int kmp(char ss1[],char ss2[])//KMP模式匹配   
  27. {  
  28.     int i,j;  
  29.     int count1=0;  
  30.     i=0,j=0;  
  31.  while(i<len)  
  32.  {  
  33.     while(i<len&&j<n)  
  34.     {  
  35.         if(j==-1||ss1[i]==ss2[j])  
  36.         {  
  37.             ++i;++j;  
  38.         }  
  39.         else  
  40.         j=next[j];  
  41.     }  
  42.     if(j==n)  
  43.     {  
  44.         count1++;  
  45.         i=i-j+1;//注意此过程中,题目中说出现的自己可以交叉   
  46.         j=0;  
  47.     }  
  48.     
  49.  }  
  50. return count1;  
  51. }  
  52. int tongji(char ss[], char mod[])  
  53. {  
  54.     int mark;  
  55.     get_next(mod);  
  56.     mark=kmp(ss,mod);  
  57.     return mark;  
  58. }  
  59. int main()  
  60. {  
  61.     int i,j;  
  62.     int max;  
  63.     int t,m;  
  64.     int length;  
  65.     while(scanf("%d",&n)!=EOF)  
  66.     {  
  67.         scanf("%s",ss);  
  68.         len=strlen(ss);  
  69.         max=0;  
  70.         length=0;  
  71.         for(;n<=len;n++)  
  72.         {  
  73.       
  74.           for(i=0;i<len-n+1;i++)  
  75.           {  
  76.             for(j=0;j<n;j++)  
  77.             {  
  78.                 mod[j]=ss[i+j];  
  79.             }  
  80.                 t=tongji(ss,mod);  
  81.                 if(t>max)  
  82.                 {  
  83.                     max=t;  
  84.                     length=n;  
  85.                     for(int k=0;k<length;k++)  
  86.                     {  
  87.                         re[k]=mod[k];  
  88.                     }  
  89.                 }  
  90.                 if(t==max&&n>length)  
  91.                 {  
  92.                     length=n;  
  93.                     for(int k=0;k<length;k++)  
  94.                     {  
  95.                         re[k]=mod[k];  
  96.                     }  
  97.                 }  
  98.           }  
  99.        }  
  100.         for(i=0;i<length;i++)  
  101.         {  
  102.             printf("%c",re[i]);  
  103.         }  
  104.     printf("\n");  
  105.     }  
  106. return 0;  
  107. }  
原创粉丝点击