#include <string>
#include <vector>
#include <iostream>
using namespace std;
void lower(string &a)
{
for(int i = 0; i < a.size(); i++)
{
if('A' <= a[i] && a[i] <= 'Z')
{
a[i] = a[i]-'A'+'a';
}
}
}
int solution(string word, vector<string> pages)
{
int stdScore[25] = {0};
double result[25] = {0};
vector<string> my_page[25];
vector<string> out_page[25];
for(int i = 0; i < pages.size(); i++)
{
// 페이지, 찾는 단어 소문자 변환
int idx = 0;
lower(pages[i]);
lower(word);
// my_page
idx = pages[i].find("<meta property=\"og:url\"", idx);
idx = pages[i].find("https://", idx);
string my_url = "";
for(int j = idx; pages[i][j] != '"'; j++)
{
my_url += pages[i][j];
}
my_page[i].push_back(my_url);
// out_page
while(pages[i].find("<a href=", idx) != string::npos)
{
idx = pages[i].find("<a href=", idx);
idx = pages[i].find("https://", idx);
string link_url = "";
for(int j = idx; pages[i][j] != '"'; j++)
{
link_url += pages[i][j];
}
out_page[i].push_back(link_url);
}
// 기본점수
idx = 0;
int wordCnt = 0;
while(pages[i].find(word, idx) != string::npos)
{
bool notWord = false;
idx = pages[i].find(word, idx);
// 찾은 단어 바로 앞 확인
if(0 <= idx-1 && idx-1 < pages[i].size() && 'a' <= pages[i][idx-1] && pages[i][idx-1] <= 'z')
{
notWord = true;
}
idx += word.size();
// 찾은 단어 뒤 확인
while(0 <= idx && idx < pages[i].size() && 'a' <= pages[i][idx] && pages[i][idx] <= 'z')
{
notWord = true;
idx++;
}
if(notWord == false)
{
wordCnt++;
}
}
stdScore[i] = wordCnt;
}
// 링크점수 + 매칭점수
for(int i = 0; i < pages.size(); i++)
{
int linkCnt = 0;
vector<int> link;
for(int j = 0; j < pages.size(); j++)
{
if(i == j)
{
continue;
}
for(int k = 0; k < out_page[j].size(); k++)
{
if(my_page[i][0] == out_page[j][k])
{
link.push_back(j);
}
}
}
result[i] = stdScore[i];
for(int j = 0; j < link.size(); j++)
{
if(stdScore[link[j]] == 0 || out_page[link[j]].size() == 0)
{
continue;
}
double linkScore = (double)stdScore[link[j]] / out_page[link[j]].size();
result[i] += linkScore;
}
}
double Max = -1;
int MaxIdx = -1;
for(int i = 0; i < pages.size(); i++)
{
if(Max < result[i])
{
Max = result[i];
MaxIdx = i;
}
}
return MaxIdx;
}