uva123multimap的稳定排序和set的查找

博客介绍了在解决UVa123问题时,如何使用multimap的稳定排序功能和set的查找功能来简化代码。作者最初尝试的代码过于复杂,后来发现string的排序不稳定,并指出multimap在插入时自动进行稳定排序,set的查找功能也很便捷。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题刚开始自己撸了一发代码及其繁琐的代码,虽然AC了,但是感觉太烂了,

百度了一下,发下自己截取单词的部分写残了,写复杂了,

另外起初WA了一发,是因为不知道string自带的排序是不稳定排序。

另外这题最简单的做法是用set加上multimap,multimap自动在插入的时候进行排序,

而且是稳定排序,另外set自带的查找函数也省去了写查找了。

自己的代码:注释部分是自己截取字符串的繁琐的代码:

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#include<cctype>
#include<cmath>
#include<algorithm>
#include<sstream>
#include<string>
using namespace std;
struct ss
{
    string key;
    char s[300];
    int ai;
}result[10010];
int cmp(ss a,ss b)
{
    if(a.key!=b.key)
        return a.key<b.key;
    else
        return a.ai<b.ai;
}
int main()
{
    char word[60][15];
    char ss[300];
    int wlen=0;
    while(gets(word[wlen])&&strcmp(word[wlen],"::")) {wlen++;}
    int rlen=0;
    while(gets(ss))
    {
        for(int i=0;i<strlen(ss);i++)
        {
            if(isalpha(ss[i]))
                ss[i]=tolower(ss[i]);
        }
     //   cout<<ss<<endl;
        for(int j=0;j<strlen(ss);j++)
        {
             char temp[20];
          /*   if(isalpha(ss[j]))
            {
                 temp[len]=ss[j];
                 len++;
            }
           // cout<<temp<<endl;
            if((ss[j]==' '||ss[j]=='\0')&&len)
            {
                  temp[len]='\0';
             //   cout<<temp<<endl;
                 int k;
                 for(k=0;k<wlen;k++)
                 {
                     if(strcmp(temp,word[k])==0)
                        break;
                 }
                 if(k==wlen)
                 {
                     result[rlen].key=result[rlen].key+temp;
                     strcpy(result[rlen].s,ss);
                   //  cout<<result[rlen].s<<endl;;
                    for(int t=front;t<j;t++)
                    {
                        if(isalpha(result[rlen].s[t]))
                            result[rlen].s[t]=toupper(result[rlen].s[t]);
                    }
                    result[rlen].ai=rlen;
                    rlen++;
                 }
                 front=j;
                 len=0;
            }
            */
            if(!isalpha(ss[j])) continue;
            int tt=j;
          //  char temp[20];
            int len=0;
            while(isalpha(ss[tt]))
            {
                temp[len]=ss[tt];
                len++;
                tt++;
            }
            temp[len]='\0';
             int k;
             for(k=0;k<wlen;k++)
               {
                   if(strcmp(temp,word[k])==0)
                       break;
                }
                 if(k==wlen)
                {
                     result[rlen].key=result[rlen].key+temp;
                     strcpy(result[rlen].s,ss);
                   //  cout<<result[rlen].s<<endl;;
                    for(int t=j;t<tt;t++)
                   {
                        //if(isalpha(result[rlen].s[t]))
                            result[rlen].s[t]=toupper(result[rlen].s[t]);
                   }
                   result[rlen].ai=rlen;
                   rlen++;
                }
                 j=tt;
        }
    }
    sort(result,result+rlen,cmp);
   // for(int i=0;i<rlen;i++)
   //     cout<<result[i].s<<endl;
  //  cout<<rlen<<endl;
    for(int i=0;i<rlen;i++)
        cout<<result[i].s<<endl;
    return 0;
}
容器代码:

#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<map>
#include<set>
#include<cmath>
#include<cstring>
#include<cctype>
#include<climits>
#include<memory>
using namespace std;
#define LL long long
#define INT (1<<31)-1;
const int N=5000;
int main()
{
    set<string> ignore;
    multimap<string,string> r;
    string t;
    while(getline(cin,t)&&t!="::") ignore.insert(t);
    while(getline(cin,t))
    {
        for(int i=0;i<t.length();i++)
            t[i]=tolower(t[i]);
        for(int i=0;i<t.size();i++)
        {
            if(!isalpha(t[i]))
              continue;
            string t2;
            int j=i;
            while(isalpha(t[j]))
            {
                t2+=t[j];
                j++;
            }
            if(!ignore.count(t2))
            {
                for(int k=0;k<t2.size();k++)
                    t2[k]=toupper(t2[k]);
                string t3=t;
                t3.replace(i,t2.size(),t2);
                r.insert(make_pair(t2,t3));
            }
            i=j;
        }
    }
    for(map<string ,string> ::iterator i=r.begin();i!=r.end();i++)
        cout<<i->second<<endl;
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值