演算法訓練 字串統計 (暴力+模擬+排序)
阿新 • • 發佈:2019-02-06
問題描述
給定一個長度為n的字串S,還有一個數字L,統計長度大於等於L的出現次數最多的子串(不同的出現可以相交),如果有多個,輸出最長的,如果仍然有多個,輸出第一次出現最早的。
輸入格式
第一行一個數字L。
第二行是字串S。
L大於0,且不超過S的長度。 輸出格式 一行,題目要求的字串。
輸入樣例1:
4
bbaabbaaaaa
輸出樣例1:
bbaa
輸入樣例2:
2
bbaabbaaaaa
輸出樣例2:
aa 資料規模和約定 n<=60
S中所有字元都是小寫英文字母。
提示
列舉所有可能的子串,統計出現次數,找出符合條件的那個
第二行是字串S。
L大於0,且不超過S的長度。 輸出格式 一行,題目要求的字串。
輸入樣例1:
4
bbaabbaaaaa
輸出樣例1:
bbaa
輸入樣例2:
2
bbaabbaaaaa
輸出樣例2:
aa 資料規模和約定 n<=60
S中所有字元都是小寫英文字母。
提示
列舉所有可能的子串,統計出現次數,找出符合條件的那個
AC code:
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #include<map> #include<vector> #define LL long long #define MAXN 1000010 using namespace std; struct node{ char str[111]; int cnt; int len; int st; }substr[MAXN]; bool cmp(node a,node b) { if(a.cnt!=b.cnt) return a.cnt>b.cnt; else if(a.len!=b.len) return a.len>b.len; else return a.st<b.st; } char s[111]; int main() { int n,i,j,k,len,m,h; while(cin>>n) { cin>>s; len=strlen(s); m=0; for(k=n;k<=len;k++) { for(i=0;i<=len-k;i++) { char sub[111]; int t=0; for(j=i;j<i+k;j++) { sub[t++]=s[j]; } sub[t]='\0'; for(h=1;h<=m;h++) { if(strcmp(substr[h].str,sub)==0) { substr[h].cnt++; break; } } if(h==m+1) { m++; strcpy(substr[m].str,sub); substr[m].cnt=1; substr[m].len=k; substr[m].st=i; } } } sort(substr+1,substr+m+1,cmp); cout<<substr[1].str<<endl; } return 0; }