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 }
posted @ 2012-11-18 21:39  Naix_x  阅读(194)  评论(0编辑  收藏  举报