Just sort the entries, but also store the original position, then process the requests.
auto.cpp
#include <iostream>
#include <fstream>
#define loopi(x) loop_start(i,x,0)
#define loopj(x) loop_start(j,x,0)
#define loop_start(i,x,s) for(int i = (s); i < (x); ++i)
#define loop_rev(a,x,stop) for(int a = (x); a >= (stop); --a)
using namespace std;
struct entry {
int id;
char *name;
static int compare (const void* p1, const void* p2){
return strcmp(((entry *) p1)->name, ((entry *) p2)->name);
}
};
entry *entries;
bool startsWith(char *needle, char *haystack){
for(; *needle; ++needle, ++haystack)
if(*needle != *haystack)
return false;
return true;
}
int main() {
ofstream fout ("auto.out");
ifstream fin ("auto.in");
// Read settings and dictionary
int W, N;
fin >> W >> N;
int id = 1;
entries = new entry[W];
loopi(W){
static char buf[1001];
fin >> buf;
int len = strlen(buf);
entries[i].name = new char[len+1];
memcpy(entries[i].name, buf, sizeof(char)*(len+1));
entries[i].id = id++;
}
// Sort entries
qsort(entries, W, sizeof(entry), entry::compare);
// Process requests
loopi(N){
static char buf[1001];
int pos = -1;
int remain;
fin >> remain >> buf;
loopj(W){
// early exit if we passed the first letter
if(entries[j].name[0] > buf[0])
break;
if(startsWith(buf, entries[j].name)){
--remain;
if(!remain){
pos = entries[j].id;
break;
}
}
}
fout << pos << endl;
}
return 0;
}
No comments:
Post a Comment