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 }

你可能感兴趣的:(USACO)