-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathunique-datesize.cpp
executable file
·85 lines (80 loc) · 2.51 KB
/
unique-datesize.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#define ONE_SOURCE
#include <strstr/strin.h>
#include <iostream>
//#include <utime.h>
#include <map>
#include <string>
#include <stdlib.h>
#include <algorithm>
using std::string;
using std::pair;
using std::make_pair;
using std::multimap;
using std::cerr;
using std::cout;
using std::endl;
using std::sort;
using str::strin;
using str::read_start_line;
using str::dec;
using str::until_charclass;
using str::spn_crlf;
using str::linecol;
//удаляет все, что не повторяется
template<class cont_t, typename comp_t>
void antiuniq(cont_t * pset, const comp_t & comp)
{
typedef typename cont_t::iterator it_t;
if(pset->begin()==pset->end())
return;
it_t l,r;
l=r=pset->begin();
r++;
bool fl=false;//в первой итерации первый и (не существующий) минус первый элементы НЕ равны
while(r!=pset->end()){
if(comp(*l,*r))//если равны
fl=true;//в будущем - были равны
else{//если не равны
if(!fl){//и не были равны
pset->erase(l);//удаляем того, кто не равен ни левому ни правому
}
fl=false;//в будущем они не были равны
}
l=r;
r++;
}
if(!fl)//если последний и предпоследний(может не существовать) элементы не равны
pset->erase(l);
}
template<class cont_t>
void antiuniq(cont_t * pset){
antiuniq(pset, [](const typename cont_t::value_type & l, const typename cont_t::value_type & r){return l==r;});
}
int main(){
multimap<pair<long long,long long>,string> data;
read_start_line(strin);
while(!atend(strin)){
string path;
long long size, date;
#define ifnot(expr) if(!(expr))
ifnot(read(strin)>>dec(&size)>>'\t'>>dec(&date)
>>'\t'>>until_charclass(spn_crlf,&path)){
cerr<<"на позиции "<<linecol(strin)<<" произошла ошибка"<<endl;
exit(2);
}
data.insert(make_pair(make_pair(size,date),move(path)));
read_start_line(strin);
}
antiuniq(&data,
[](const pair<pair<long long,long long>,string> & l, const pair<pair<long long,long long>,string> & r){
return l.first.first==r.first.first && l.first.second==r.first.second;//size, date
}
);
auto oldit = data.end();
for(auto it = data.begin(); it!=data.end(); it++){
if(oldit!=data.end() && (oldit->first.first!=it->first.first || oldit->first.second!=it->first.second))
cout<<endl;
cout<<it->first.first<<'\t'<<it->first.second<<'\t'<<it->second<<endl;
oldit=it;
}
}