USACO 3.1 Contact(STL)
先是搞了一下map的用法。。。C++学的太搓了。。这个题除了map之外,真心没想到啥好方法啊。。。乱搞一下,各种小错误,终于过了。。
1 /* 2 ID: cuizhe 3 LANG: C++ 4 TASK: contact 5 */ 6 #include <cstdio> 7 #include <cstring> 8 #include <iostream> 9 #include <queue> 10 #include <map> 11 using namespace std; 12 #define N 200001 13 map<string,int>mp; 14 map<string,int>::iterator it; 15 char str[N],s[30]; 16 string p[1001]; 17 int judge(int x,int y) 18 { 19 int len1,len2,i; 20 len1 = p[x].size(); 21 len2 = p[y].size(); 22 if(len1 > len2) 23 return 1; 24 else if(len1 < len2) 25 return 0; 26 for(i = 0;i <= len1-1;i ++) 27 { 28 if(p[x][i] > p[y][i]) 29 return 1; 30 else if(p[x][i] < p[y][i]) 31 return 0; 32 } 33 return 0; 34 } 35 void sp(int x,int y) 36 { 37 string temp; 38 temp = p[x]; 39 p[x] = p[y]; 40 p[y] = temp; 41 } 42 int main() 43 { 44 int i,j,k,n,a,b,len,num; 45 string temp; 46 freopen("contact.in","r",stdin); 47 freopen("contact.out","w",stdout); 48 scanf("%d%d%d",&a,&b,&n); 49 i = 0; 50 while(scanf("%s",str+i) == 1) 51 { 52 i += strlen(str+i); 53 } 54 len = strlen(str); 55 for(i = 0;i <= len-1;i ++) 56 { 57 for(j = 0;j <= b-1&&j+i <= len-1;j ++) 58 { 59 s[j] = str[i+j]; 60 if(j >= a-1) 61 { 62 s[j+1] = '\0'; 63 mp[s] ++; 64 } 65 } 66 } 67 for(i = 1;i <= n;i ++) 68 { 69 int t = 0; 70 for(it = mp.begin();it != mp.end();it ++) 71 { 72 if(t < (*it).second) 73 { 74 t = (*it).second; 75 } 76 } 77 if(t == 0) break; 78 printf("%d\n",t); 79 num = 1; 80 for(it = mp.begin();it != mp.end();it ++) 81 { 82 if(t == (*it).second) 83 { 84 p[num++] = (*it).first; 85 (*it).second = 0; 86 } 87 } 88 num --; 89 for(j = 1;j <= num-1;j ++) 90 { 91 for(k = 1;k <= num-j;k ++) 92 { 93 if(judge(k,k+1)) 94 { 95 sp(k,k+1); 96 } 97 } 98 } 99 for(j = 1;j <= num;j ++) 100 { 101 if(j%6 == 1) 102 cout<<p[j]; 103 else 104 cout<<" "<<p[j]; 105 if(j%6 == 0||j == num) 106 printf("\n"); 107 } 108 } 109 return 0; 110 }