12. Plágiumkereső
Czirkos Zoltán · 2019.02.27.
#include <algorithm>
#include <string>
#include <fstream>
#include <iostream>
#include <set>
#include <vector>
#include <iterator>
struct Dolgozat {
std::string fnev, nev, neptun;
std::set<std::string> parok;
Dolgozat(std::string fnev, std::string nev, std::string neptun)
: fnev(fnev), nev(nev), neptun(neptun)
{
std::ifstream is(fnev);
std::string uj, elozo;
is >> elozo;
while (is >> uj) {
parok.insert(elozo + " " + uj);
elozo = uj;
}
}
};
std::vector<Dolgozat> dolgozatok_beolvas(std::string input_fnev) {
std::vector<Dolgozat> dolgozatok;
std::ifstream is(input_fnev);
std::string fnev, neptun, nev;
while (is >> fnev >> neptun) {
std::getline(is, nev);
dolgozatok.push_back(Dolgozat(fnev, nev, neptun));
}
return dolgozatok;
}
struct Hasonlosag {
Dolgozat const *d1, *d2;
double mertek;
Hasonlosag(Dolgozat const * d1, Dolgozat const * d2)
: d1(d1), d2(d2)
{
std::set<std::string> metszet;
std::set_intersection(d1->parok.begin(), d1->parok.end(),
d2->parok.begin(), d2->parok.end(),
std::inserter(metszet, metszet.begin()));
mertek = std::max(
(double)metszet.size() / (double)d1->parok.size(),
(double)metszet.size() / (double)d2->parok.size());
}
bool operator< (Hasonlosag const & masik) const {
return this->mertek < masik.mertek;
}
};
std::vector<Hasonlosag> hasonlit(std::vector<Dolgozat> const & dolgozatok) {
std::vector<Hasonlosag> hasonlosagok;
for (size_t i = 0; i != dolgozatok.size(); ++i)
for (size_t j = i+1; j != dolgozatok.size(); ++j)
hasonlosagok.push_back(Hasonlosag(&dolgozatok[i], &dolgozatok[j]));
return hasonlosagok;
}
int main() {
std::vector<Dolgozat> dolgozatok = dolgozatok_beolvas("input.ctr");
std::vector<Hasonlosag> hasonlosagok = hasonlit(dolgozatok);
std::sort(hasonlosagok.rbegin(), hasonlosagok.rend()); /* reverse iterator! */
for (size_t i = 0; i < 20; ++i)
std::cout << hasonlosagok[i].mertek*100
<< "% " << hasonlosagok[i].d1->fnev
<< " " << hasonlosagok[i].d2->fnev << std::endl;
}