#include <cctype>
#include <string>
#include <vector>
#include "split.h"
using std::vector;
using std::string;
using std::isspace;
vector<string> split(const string& s)
{
vector<string> ret;
typedef string::size_type string_size;
string_size i = 0;
// invariant: we have processed characters `['original value of `i', `i)'
while (i != s.size()) {
// ignore leading blanks
// invariant: characters in range `['original `i', current `i)' are all spaces
while (i != s.size() && isspace(s[i]))
++i;
// find end of next word
string_size j = i;
// invariant: none of the characters in range `['original `j', current `j)' is a space
while (j != s.size() && !isspace(s[j]))
++j;
// if we found some nonwhitespace characters
if (i != j) {
// copy from `s' starting at `i' and taking `j' `\-' `i' chars
ret.push_back(s.substr(i, j - i));
i = j;
}
}
return ret;
}
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <vector>
#include "split.h"
using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::istream;
using std::map;
using std::string;
map<string ,vector<int> > xref(istream& in,vector<string> find_words(const string&)=split)
{
string line;
int line_number=0;
map<string,vector<int> >ret;
while(getline(in,line)){
++line_number;
vector<string>words=find_words(line);
for(vector<string>::const_iterator it=words.begin();
it!=words.end();++it)
ret[*it].push_back(line_number);
}
return ret;
}
int main()
{
map<string,vector<int> > ret=xref(cin);
for(map<string,vector<int> >::const_iterator it=ret.begin();
it!=ret.end();++it){
cout<<it->first<<" occurs on line(s) :";
vector<int>::const_iterator line_it=it->second.begin();
cout<<*line_it;
++line_it;
while(line_it!=it->second.end()){
cout<<" ,"<<*line_it;
++line_it;
}
cout<<endl;
}
system("pause");
return 0;
}