//
Runtime:
564 ms
vector<int> findSubstring(string S, vector<string> &L) {
int sLen = S.length();
if (sLen == 0) return vector<int>();
int size = L.size();
if (size == 0) return vector<int>();
int len = L[0].length();
map<string, int> mp;//, map_dup;
map<string, int>::iterator it;
vector<int> ret;
for (auto str : L){ mp[str]++; }
for (int i = 0; i <= sLen - size * len; ++i){
map<string, int> mp1;
map<string, int>::iterator it1;
string subs = S.substr(i, size * len);
for (int j = 0; j < subs.length(); j += len){ mp1[subs.substr(j, len)]++; }
if (mp1.size() != mp.size()) continue;
bool flag = false;
for (it = begin(mp), it1 = begin(mp1); it != end(mp) && it1 != end(mp1); ++it, ++it1){
if (it->first != it1->first || it->second != it1->second){ flag = true; break; }
}
if (!flag){ ret.push_back(i); }
}
return ret;
}