But I'm still stuck!!!Upon closer inspection of my name-reading routine, I see that it was slightly more complicated than I described yesterday. Here's a detailed description (for reading an entire author, first and last name):
1. Skip whitespace
2. Add until null or ',' (there's your first name)
3. If we stopped on a ',': skip past it.
4. Skip whitespace
5. Add until null or ',' or ':' or whitespace (there's your last name)
6. Repeat reading names this way until the last char was null or ':'.
Here's my code:
Code: Select all
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <queue>
#include <set>
using namespace std;
int main()
{
int testcases, P, N, init, erdoNum, inputNamePtr;
short scenario;
bool noLastName;
string * namesOrder;
map<string, int> namesOrderMap;
map<string, int>::iterator iterp;
string line, curName, inputName;
multimap<string, string> nameMap;
queue<string> tempNames;
set<string> visited;
vector<string> databaseLine;
vector<string>::iterator iteri, iterj;
multimap<string, string>::iterator iterm, itern;
cin >> testcases;
scenario = 1;
while (testcases>0) {
cin >> P;
cin >> N;
cin.ignore(); // skip \n
nameMap.clear();
for (short i=0; i<P; i++) {
getline(cin, line);
databaseLine.clear();
while ((init = line.find(".,")) != string::npos) {
inputNamePtr = 0;
inputName = "";
while (line[inputNamePtr] == ' ' && inputNamePtr<line.length())
inputNamePtr++;
while (line[inputNamePtr] != ',' && inputNamePtr<line.length()) {
inputName += line[inputNamePtr];
inputNamePtr++;
}
inputName += ", ";
inputNamePtr++;
while (line[inputNamePtr] == ' ' && inputNamePtr<line.length())
inputNamePtr++;
while (line[inputNamePtr] != ',' && inputNamePtr<line.length()) {
inputName += line[inputNamePtr];
inputNamePtr++;
}
databaseLine.push_back(inputName);
line = line.substr(init+3, line.length() - (init+3));
}
inputNamePtr = 0;
inputName = "";
while (line[inputNamePtr] == ' ' && inputNamePtr<line.length())
inputNamePtr++;
while (line[inputNamePtr] != ',' && inputNamePtr<line.length()) {
inputName += line[inputNamePtr];
inputNamePtr++;
}
inputName += ", ";
inputNamePtr++;
noLastName = true;
while (line[inputNamePtr] == ' ' && inputNamePtr<line.length())
inputNamePtr++;
while (line[inputNamePtr] != ':' && inputNamePtr<line.length()) {
inputName += line[inputNamePtr];
noLastName=false;
inputNamePtr++;
}
if (!noLastName) databaseLine.push_back(inputName);
for (iteri=databaseLine.begin(); iteri != databaseLine.end(); ++iteri) {
for(iterj=databaseLine.begin(); iterj != databaseLine.end(); ++iterj) {
if (iteri != iterj)
nameMap.insert(make_pair(*iteri, *iterj));
}
}
}
namesOrderMap.clear();
namesOrder = new string[N];
for (short i=0; i<N; i++) {
getline(cin, line);
inputNamePtr = 0;
namesOrder[i] = "";
while (line[inputNamePtr] == ' ' && inputNamePtr<line.length())
inputNamePtr++;
while (line[inputNamePtr] != ',' && inputNamePtr<line.length()) {
namesOrder[i] += line[inputNamePtr];
inputNamePtr++;
}
namesOrder[i] += ", ";
inputNamePtr++;
while (line[inputNamePtr] == ' ' && inputNamePtr<line.length())
inputNamePtr++;
while (line[inputNamePtr] != ' ' && inputNamePtr<line.length()) {
namesOrder[i] += line[inputNamePtr];
inputNamePtr++;
}
}
// processing
while (! tempNames.empty() ) tempNames.pop();
visited.clear();
erdoNum = 0;
namesOrderMap["Erdos, P."] = 0;
tempNames.push("Erdos, P.");
visited.insert("Erdos, P.");
while (! tempNames.empty() ) {
curName = tempNames.front();
tempNames.pop();
erdoNum++;
iterm = nameMap.find(curName);
itern = nameMap.upper_bound(curName);
while( iterm != itern) {
if (visited.find(iterm->second) == visited.end()) {
tempNames.push(iterm->second);
visited.insert(iterm->second);
if ((iterp=namesOrderMap.find(iterm->second)) == namesOrderMap.end()) {
namesOrderMap[iterm->second] = erdoNum;
}
else {
if (erdoNum <= iterp->second) iterp->second = erdoNum;
}
}
++iterm;
}
}
// output
cout << "Scenario " << scenario << "\n";
scenario++;
for (short i=0; i<N; i++) {
if (namesOrderMap.find(namesOrder[i]) != namesOrderMap.end())
cout<<namesOrder[i]<<" "<<namesOrderMap[namesOrder[i]] << "\n";
else
cout<<namesOrder[i]<<" "<<"infinity"<<"\n";
}
// clean up
delete[] namesOrder;
testcases--;
}
return 0;
}