这个题我用了三种方法做,都是超时,最后set也超时,后来看人家的解题报告才明白,输入有问题,这种输入要考虑很多方面,今天又学到了一个分割字符串的方法,如下:
str1,str2都是string类型
描述
给定两个集合A和B的所有元素,计算它们的交、并、差集。
输入
输入数据有多组,第一行为数据的组数T,接下来有2T行,每组数据占2行,每行有若干个整数,第一行的所有整数构成集合A,第二行的所有整数构成集合B,分别用空格分隔。A和B最多分别不超过100个元素。
输出
输出A、B的交、并、差集中的所有元素(以递增顺序)。每个集合占一行,数据元素之间用空格分隔。
样例输入
1
0 1 2 3 4 5 6 7 8 8
3 6 8 9
0 1 2 3 4 5 6 7 8 8
3 6 8 9
样例输出
3 6 8
0 1 2 3 4 5 6 7 8 9
0 1 2 4 5 7
0 1 2 3 4 5 6 7 8 9
0 1 2 4 5 7
#include<iostream>
#include<cstring>
#include<sstream>
#include<cstdio>
#include <algorithm>
#include<set>
using namespace std;
int main()
{
set<int>a;
set<int>b;
set<int>c;
int n,x,l,aa;
string str1,str2;
scanf("%d",&n);
getchar();
while(n--)
{
int i=0,j=0,x=0,f=1,t;
getline(cin,str1);
std::stringstream ss(str1);
while (ss>>aa)
{
a.insert(aa);
}
getline(cin,str2);
std::stringstream ss1(str2);
while (ss1>>aa)
{
b.insert(aa);
}
set<int>::iterator ii;
// set_union(a.begin(),a.end(),b.begin(),b.end(),insert_iterator(set<int> >(c,c.begin())));
set_intersection(a.begin(),a.end(),b.begin(),b.end(),insert_iterator<set<int> >(c,c.begin()));
l=c.size();i=0;
for(ii=c.begin();ii!=c.end();ii++)
{
i++;
if(i<l) printf("%d ",(*ii));
else printf("%d\n",*ii);
}
c.clear();
set_union(a.begin(),a.end(),b.begin(),b.end(),insert_iterator<set<int> >(c,c.begin()));
l=c.size();i=0;
for(ii=c.begin();ii!=c.end();ii++)
{
i++;
if(i<l) printf("%d ",(*ii));
else printf("%d\n",(*ii));
// if(i<l)cout<<(*ii)<<" ";
// else cout<<(*ii)<<endl;
}
c.clear();
set_difference(a.begin(),a.end(),b.begin(),b.end(),insert_iterator<set<int> >(c,c.begin()));
l=c.size();i=0;
for(ii=c.begin();ii!=c.end();ii++)
{
i++;
if(i<l) printf("%d ",(*ii));
else printf("%d\n",(*ii));
}
c.clear();
}
return 0;
}