SRM357 div2 hard
ワーシャルフロイドではなかなか通らないので
ダイクストラを使うべし(解説に書いてあった)
ビット演算とかどんだけ
#include <vector> #include <string> #include <cstring> #include <set> #include <sstream> #include <utility> using namespace std; typedef long long LL; class WebsiteRank { public: int n; bool G[1000][1000]; bool H[1000][1000]; vector<LL> weight; set<string> siteToNum; int sToN(string s) { return (int)distance(siteToNum.begin(),siteToNum.find(s)); } LL rec(int index) { LL &r=weight[index]; if(r!=-1) return r; r=1; for(int i=0;i<n;i++) if(G[index][i]) r+=rec(i); return r; } LL countVotes(vector <string> votes, string website) { vector<vector<string> > input(votes.size()); for(int i=0;i<(int)votes.size();i++) { stringstream ss(votes[i]); string s; while(ss >> s) { input[i].push_back(s); siteToNum.insert(s); } } n=siteToNum.size(); memset(G,false,sizeof(G)); memset(H,false,sizeof(H)); for(int i=0;i<(int)votes.size();i++) { string s=input[i][0]; int a=sToN(s); for(int j=1;j<input[i].size();j++) { int b=sToN(input[i][j]); G[a][b]=H[a][b]=true; } } for(int i=0;i<n;i++) G[i][i]=H[i][i]=true; for(int k=0;k<n;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) H[i][j]=(H[i][j] || (H[i][k]&&H[k][j]) ); for(int i=0;i<n;i++) for(int j=i;j<n;j++) if(H[i][j] && H[j][i]) G[i][j]=G[j][i]=false; weight=vector<LL>(n,-1); return rec(sToN(website)); } };