class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
int n=words.size(),m=words[0].size(),ls=s.size();
unordered_map<string,int>h;
for(auto & w : words) h[w]++;
vector<int>res;
for(int i=0;i<m && i+m*n<=ls;i++) //边界1
{
unordered_map<string,int>windows;
int l=i,r=i,cnt=0;
while(r+m-1<=ls) //边界2
{
string str=s.substr(r,m);
if(h.count(str))
{
windows[str]++;
if(windows[str]==h[str]) cnt++;
}
while(r-l+1>n*m) //边界3
{
string str1=s.substr(l,m);
l+=m;
if(h.count(str1))
{
if(windows[str1]==h[str1]) cnt--;
windows[str1]--;
}
}
if(cnt==h.size()) res.emplace_back(l);
r+=m;
}
}
return res;
}
};