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;
}