(STL中的set)需反复掌握

Problem Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
 

Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
 

Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
 

Sample Input
you are my friend
#

Sample Output
4

参考了一些不一样的用法:

1.set集合

 

 

2.getline()输入string。getline(cin,line,'#');意思为输入一串不连续字符串遇到‘#’停止输入。

很多时候我们做题目会写成while(getline(cin,line))。注意这里的while语句若是输入空字符串加换行仍然无法跳出循环,因为输入合法。要跳出循环一定要在再写个判断语句。

 

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <sstream>
#include<string>
#include<set>
using namespace std;

int main()
{
    string str1,str2;
    while(getline(cin,str1))
    {

        if(str1 == "#")
            break;
        istringstream stream(str1);
        set<string>Set;//定义一个集合
        while(stream>>str2)//拆分成单词
        {
            Set.insert(str2);
        }
        cout<<Set.size()<<endl;
    }
    return 0;
}

 

poj 2269

set 中的交并差集运算的应用

Sample Input

{ABC}
{ABC}+{DEFG}+{Z}+{}
{ABE}*{ABCD}
{ABCD}-{CZ}
{ABC}+{CDE}*{CEZ}
({ABC}+{CDE})*{CEZ}

Sample Output

{ABC}
{ABCDEFGZ}
{AB}
{ABD}
{ABCE}
{CE}

 

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<set>
#include<stack>
#include<iterator>
using namespace std;
#define maxn 300
char temp[maxn];
int value[128];
int stacki;
string c,s;
void adjust()
{
    s.clear();
    stacki=0;
    for(int i=0;i!=c.size();i++)
        if(c[i]=='(')
            temp[stacki++]=-1;
        else if(c[i]==')')
        {
            while(temp[stacki-1]!=-1)
                s.push_back(temp[--stacki]);
            stacki--;
        }
        else if(c[i]=='{')
        {
            for(;c[i]!='}';i++)
                s.push_back(c[i]);
            s.push_back(c[i]);
        }
        else
        {
            while(stacki!=0&&temp[stacki-1]!=-1&&value[temp[stacki-1]]>=value[c[i]])
                s.push_back(temp[--stacki]);
            temp[stacki++]=c[i];
        }
    while(stacki!=0)
        s.push_back(temp[--stacki]);
}
set<char>solve()
{
    set<char>stack[maxn];
    set<char>temp;
    stacki=0;
    for(int i=0;i!=s.size();i++)
        if(s[i]=='{')
        {
            i++;
            stack[stacki].clear();
            for(;s[i]!='}';i++)
                stack[stacki].insert(s[i]);
            stacki++;
        }
        else if(s[i]=='+')
        {
            --stacki;
            temp.clear();
            set_union(stack[stacki-1].begin(),stack[stacki-1].end(),
                        stack[stacki].begin(),stack[stacki].end(),
                        inserter(temp,temp.begin()));
            stack[stacki-1]=temp;
        }
        else if(s[i]=='-')
        {
            --stacki;
            temp.clear();
            set_difference(stack[stacki-1].begin(),stack[stacki-1].end(),
                        stack[stacki].begin(),stack[stacki].end(),
                        inserter(temp,temp.begin()));
            stack[stacki-1]=temp;
        }
        else
        {
            --stacki;
            temp.clear();
            set_intersection(stack[stacki-1].begin(),stack[stacki-1].end(),
                        stack[stacki].begin(),stack[stacki].end(),
                        inserter(temp,temp.begin()));
            stack[stacki-1]=temp;
        }
    return stack[0];
}
int main()
{
    value['+']=value['-']=0;
    value['*']=1;
    while(cin>>c)
    {
        adjust();
        set<char>ans=solve();
        printf("{");
        for(set<char>::iterator i=ans.begin();i!=ans.end();i++)
            printf("%c",*i);
        printf("}\n");
    }
    return 0;
}

 

hdu 1623 水果

题意:对同一地方的同一水果进行归类。

这题我是用结构体写的,附上代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<set>
#include<stack>
#include<iterator>
using namespace std;
#define maxn 300

struct studen{
        string name;
        string area;
        int x;
};
studen stu[200];

bool cmp(studen &x,studen &y)
{
        if(x.area==y.area)
                return x.name<y.name;
        return x.area<y.area;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
            int i,n;
            scanf("%d",&n);
            int cnt=0;
            for(i=0;i<n;i++)
            {

                    cin>>stu[i].name;
                    cin>>stu[i].area;
                    scanf("%d",&stu[i].x);

            }
            sort(stu,stu+n,cmp);
            string x,y;x=stu[0].area;y=stu[0].name;
            int p;p=stu[0].x;
            for(i=1;i<n;i++)
            {
                    if(x==stu[i].area&&y==stu[i].name)
                        p=p+stu[i].x;
                    else {
                                stu[cnt].area=x;stu[cnt].name=y;stu[cnt++].x=p;
                        x=stu[i].area;y=stu[i].name;p=stu[i].x;

                    }

            }
            if(x==stu[cnt-1].area&&y==stu[cnt-1].name)
               stu[cnt].x+=p;
            else
            {
                    stu[cnt].area=x;stu[cnt].name=y;stu[cnt++].x=p;
            }
            cout<<stu[0].area<<endl;x=stu[0].area;
            printf("   |----");
            cout<<stu[0].name;
            printf("(%d)\n",stu[0].x);
            for(i=1;i<cnt;i++)
            {
                    if(x!=stu[i].area)
                    {
                          cout<<stu[i].area<<endl;x=stu[i].area;
                    }

                    printf("   |----");
            cout<<stu[i].name;
            printf("(%d)\n",stu[i].x);
            }
            if(t)
                printf("\n");
    }
    return 0;
}
/*
2
5
apple shandong 3
pill shandong 100
pineapple guangdong 1
pineapple guangdong 3
pineapple guangdong 1
*/

附上大神们用二维map写的简单解法:

#include <cstdio>
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
 
using namespace std;
 
typedef map<string, map<string, int> > mapp;
 
int main()
{
    int t, n, i, k;
    string fruit, place;
    mapp a;
    mapp::iterator ite;
    map<string, int>::iterator jte;
 
    cin>>t;
    while(t--){
        cin>>n;
        for(i=0; i<n; i++){
            cin>>fruit>>place>>k;
            a[place][fruit] += k;
        }
 
        for(ite=a.begin(); ite!=a.end(); ite++){
            cout<<ite->first<<endl;
            for(jte=(ite->second).begin(); jte!=(ite->second).end(); jte++){
                cout<<"   |----"<<jte->first<<'('<<jte->second<<')'<<endl;
            }
        }
        a.clear();
        if(t!=0) cout<<endl;
    }
 
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值