#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
#include <iterator>
struct strptr;
typedef std::priority_queue<strptr> pqueue;
void put_words(pqueue& pq, const char* s, const char* delim);
bool out_share_words(std::ostream& _out, pqueue& pq1, pqueue& pq2);
struct strptr {
const char* ptr;
int len;
strptr(void):ptr(NULL), len(0){}
strptr(const char* _p, int _n):ptr(_p), len(_n){}
bool operator < (const strptr& p) const {
return ((len < p.len) ||
((len == p.len) && std::lexicographical_compare(p.ptr, p.end(), ptr, ptr + len)));
}
const char* begin(void) const { return ptr; }
const char* end(void) const { return ptr + len; }
};
int main(void){
char s1[] = "AAAA, BBBB, XXXX, ABCD, D, EEEE, F...QQQQ";
char s2[] = "EEEE, QQQQ, Z, X, YY. ABCD, AAAA";
pqueue pq1, pq2;
put_words(pq1, s1, " \n\t.,");
put_words(pq2, s2, " \n\t.,");
if(! out_share_words(std::cout, pq1, pq2))
std::cout << "Not find!" << std::endl;
return 0;
}
//вывод самых длинных общих слов
bool out_share_words(std::ostream& _out, pqueue& pq1, pqueue& pq2){
std::ostream_iterator<char> _osrt(_out, "");
if(pq1.empty() || pq2.empty())
return false;
int n = pq1.top().len;
if(n != pq2.top().len)
return false;
bool ok = false;
while(!pq1.empty() && !pq2.empty()){
if((pq1.top().len != n) || (pq2.top().len != n))
break;
const strptr& a = pq1.top();
const strptr& b = pq2.top();
if(std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end()))
pq1.pop();
else {
if(! memcmp(a.begin(), b.begin(), b.len)){
std::copy(a.begin(), a.end(), _osrt);
std::cout << std::endl;
ok = true;
pq1.pop();
}
pq2.pop();
}
}
return ok;
}
//слова
void put_words(pqueue& pq, const char* s, const char* delim){
int n, m = 0;
const char* p = s;
while((s = strpbrk(s, delim)) != NULL){
n = (int)(s - p);
if((n > 0) && (n >= m)){
m = n;
pq.push(strptr(p, n));
}
while(*s && (strchr(delim, *s) != NULL))
++s;
p = s;
}
if(*p){
for(s = p; *s; ++s)
;
if(((n = (int)(s - p)) > 0) && (n >= m))
pq.push(strptr(p, n));
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8aXRlcmF0b3I+CnN0cnVjdCBzdHJwdHI7CnR5cGVkZWYgc3RkOjpwcmlvcml0eV9xdWV1ZTxzdHJwdHI+IHBxdWV1ZTsKdm9pZCBwdXRfd29yZHMocHF1ZXVlJiBwcSwgY29uc3QgY2hhciogcywgY29uc3QgY2hhciogZGVsaW0pOwpib29sIG91dF9zaGFyZV93b3JkcyhzdGQ6Om9zdHJlYW0mIF9vdXQsIHBxdWV1ZSYgcHExLCBwcXVldWUmIHBxMik7CgpzdHJ1Y3Qgc3RycHRyIHsKCWNvbnN0IGNoYXIqIHB0cjsKCWludCBsZW47CgoJc3RycHRyKHZvaWQpOnB0cihOVUxMKSwgbGVuKDApe30KCXN0cnB0cihjb25zdCBjaGFyKiBfcCwgaW50IF9uKTpwdHIoX3ApLCBsZW4oX24pe30KCglib29sIG9wZXJhdG9yIDwgKGNvbnN0IHN0cnB0ciYgcCkgY29uc3QgewoJCXJldHVybiAoKGxlbiAgPCBwLmxlbikgfHwgCgkJICAgICAgICgobGVuID09IHAubGVuKSAmJiBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKHAucHRyLCBwLmVuZCgpLCBwdHIsIHB0ciArIGxlbikpKTsKCX0KCgljb25zdCBjaGFyKiBiZWdpbih2b2lkKSBjb25zdCB7IHJldHVybiBwdHI7IH0KCWNvbnN0IGNoYXIqIGVuZCh2b2lkKSAgIGNvbnN0IHsgcmV0dXJuIHB0ciArIGxlbjsgfQp9OwoKCmludCBtYWluKHZvaWQpewoJY2hhciBzMVtdID0gIkFBQUEsIEJCQkIsIFhYWFgsIEFCQ0QsIEQsIEVFRUUsIEYuLi5RUVFRIjsKCWNoYXIgczJbXSA9ICJFRUVFLCBRUVFRLCBaLCBYLCBZWS4gQUJDRCwgQUFBQSI7CgoJcHF1ZXVlIHBxMSwgcHEyOwoJcHV0X3dvcmRzKHBxMSwgczEsICIgXG5cdC4sIik7CglwdXRfd29yZHMocHEyLCBzMiwgIiBcblx0LiwiKTsKCglpZighIG91dF9zaGFyZV93b3JkcyhzdGQ6OmNvdXQsIHBxMSwgcHEyKSkKCQlzdGQ6OmNvdXQgPDwgIk5vdCBmaW5kISIgPDwgc3RkOjplbmRsOwoJcmV0dXJuIDA7Cn0KCi8v0LLRi9Cy0L7QtCDRgdCw0LzRi9GFINC00LvQuNC90L3Ri9GFINC+0LHRidC40YUg0YHQu9C+0LIKYm9vbCBvdXRfc2hhcmVfd29yZHMoc3RkOjpvc3RyZWFtJiBfb3V0LCBwcXVldWUmIHBxMSwgcHF1ZXVlJiBwcTIpewoJc3RkOjpvc3RyZWFtX2l0ZXJhdG9yPGNoYXI+IF9vc3J0KF9vdXQsICIiKTsKCWlmKHBxMS5lbXB0eSgpIHx8IHBxMi5lbXB0eSgpKQoJCXJldHVybiBmYWxzZTsKCglpbnQgbiA9IHBxMS50b3AoKS5sZW47CglpZihuICE9IHBxMi50b3AoKS5sZW4pCgkJcmV0dXJuIGZhbHNlOwoKCWJvb2wgb2sgPSBmYWxzZTsKCXdoaWxlKCFwcTEuZW1wdHkoKSAmJiAhcHEyLmVtcHR5KCkpewoJCWlmKChwcTEudG9wKCkubGVuICE9IG4pIHx8IChwcTIudG9wKCkubGVuICE9IG4pKQoJCQlicmVhazsKCgkJY29uc3Qgc3RycHRyJiBhID0gcHExLnRvcCgpOwoJCWNvbnN0IHN0cnB0ciYgYiA9IHBxMi50b3AoKTsKCQlpZihzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKGEuYmVnaW4oKSwgYS5lbmQoKSwgYi5iZWdpbigpLCBiLmVuZCgpKSkKCQkJcHExLnBvcCgpOwoJCWVsc2UgewoJCQlpZighIG1lbWNtcChhLmJlZ2luKCksIGIuYmVnaW4oKSwgYi5sZW4pKXsKCQkJCXN0ZDo6Y29weShhLmJlZ2luKCksIGEuZW5kKCksIF9vc3J0KTsKCQkJCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CgkJCQlvayA9IHRydWU7CgkJCQlwcTEucG9wKCk7CgkJCX0KCQkJcHEyLnBvcCgpOwoJCX0KCX0KCXJldHVybiBvazsKfQoKLy/RgdC70L7QstCwCnZvaWQgcHV0X3dvcmRzKHBxdWV1ZSYgcHEsIGNvbnN0IGNoYXIqIHMsIGNvbnN0IGNoYXIqIGRlbGltKXsKCWludCBuLCBtID0gMDsKCWNvbnN0IGNoYXIqIHAgPSBzOwoJd2hpbGUoKHMgPSBzdHJwYnJrKHMsIGRlbGltKSkgIT0gTlVMTCl7CgkJbiA9IChpbnQpKHMgLSBwKTsKCQlpZigobiA+IDApICYmIChuID49IG0pKXsKCQkJbSA9IG47CgkJCXBxLnB1c2goc3RycHRyKHAsIG4pKTsKCQl9CgoJCXdoaWxlKCpzICYmIChzdHJjaHIoZGVsaW0sICpzKSAhPSBOVUxMKSkKCQkJKytzOwoJCXAgPSBzOwoJfQoKCWlmKCpwKXsKCQlmb3IocyA9IHA7ICpzOyArK3MpCgkJCTsKCQlpZigoKG4gPSAoaW50KShzIC0gcCkpID4gMCkgJiYgKG4gPj0gbSkpCgkJCXBxLnB1c2goc3RycHRyKHAsIG4pKTsKCX0KfQ==