#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
vector<int> e[N], vt[N];
namespace ACAM{
int t[N][26], fail[N], ed[N], tot;
void insert(char *s) {
int len=strlen(s), u=0;
for(int i=0; i<len; i++) {
int v=s[i]-'a';
if(!t[u][v]) t[u][v]=++tot;
u=t[u][v];
}
ed[u]++;
}
void build() {
queue<int> q;
for(int i=0; i<26; i++)
if(t[0][i]) q.push(t[0][i]);
while(!q.empty()) {
int u=q.front(); q.pop();
for(int i=0; i<26; i++) {
if(t[u][i]) fail[t[u][i]]=t[fail[u]][i], q.push(t[u][i]);
else t[u][i]=t[fail[u]][i];
}
}
for(int i=1; i<=tot; i++) e[fail[i]].push_back(i);
}
void getpos(vector<int> &a, char *s) {
int len=strlen(s), u=0;
for(int i=0; i<len; i++) {
int v=s[i]-'a';
u=t[u][v];
a.push_back(u);
}
}
}
int fa[N][20], dep[N], dfn[N], dis[N], cnt;
void dfs(int u) {
dfn[u]=++cnt;
for(int i=1; i<=19; i++)
fa[u][i]=fa[fa[u][i-1]][i-1];
for(int v:e[u]) {
fa[v][0]=u;
dep[v]=dep[u]+1;
dis[v]=dis[u]+ACAM::ed[v];
dfs(v);
}
}
int lca(int x, int y) {
if(dep[x]<dep[y]) swap(x, y);
for(int i=19; ~i; i--)
if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
if(x==y) return x;
for(int i=19; ~i; i--)
if(fa[x][i]!=fa[y][i]) x=fa[x][i], y=fa[y][i];
return fa[x][0];
}
bool tag1[N], tag2[N];
int D[N];
bool cmp(int a, int b) {
return dfn[a]<dfn[b];
}
void buildvt(const vector<int> &a, const vector<int> &b) {
vector<int> c=a;
for(auto v:b) c.push_back(v);
c.push_back(0);
sort(c.begin(), c.end(), cmp);
for(int i=0, len=c.size(); i<len-1; i++)
c.push_back(lca(c[i], c[i+1]));
sort(c.begin(), c.end(), cmp);
c.erase(unique(c.begin(), c.end()), c.end());
for(int i=0, len=c.size(); i<len-1; i++) {
int f=lca(c[i], c[i+1]), s=c[i+1];
vt[f].push_back(s);
D[s]=dis[s]-dis[f];
}
for(auto v:c) tag1[v]=tag2[v]=0;
for(auto v:a) tag1[v]=1;
for(auto v:b) tag2[v]=1;
}
int ret;
void dfsv(int u) {
for(int v:vt[u]) {
dfsv(v);
tag1[u]|=tag1[v]; tag2[u]|=tag2[v];
}
if(tag1[u]&&tag2[u]) ret+=D[u];
vt[u].clear();
}
void dfsc(int u) {
for(int v:vt[u]) {
dfsc(v);
}
ret+=D[u];
vt[u].clear();
}
int n, m, q, ans[N], id[N], rev[N];
char s[N], t[N];
vector<int> post[N];
vector<pair<int, int> > qry[N];
bool tag[N];
int W[N];
void predfs(int u) {
for(int v:e[u]) {
predfs(v);
tag[u]|=tag[v];
}
if(tag[u]) W[u]=ACAM::ed[u];
else W[u]=0;
}
void predfs2(int u) {
for(int v:e[u]) {
dis[v]=dis[u]+W[v];
predfs2(v);
}
}
vector<int> em;
int main() {
double ti=clock();
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m>>q;
for(int i=1; i<=n; i++)
cin>>s, ACAM::insert(s);
ACAM::build();
for(int i=1; i<=m; i++) {
cin>>t; id[i]=i;
ACAM::getpos(post[i], t);
}
sort(id+1, id+1+m, [&](int a, int b) {
return post[a].size()>post[b].size();
});
for(int i=1; i<=m; i++) rev[id[i]]=i;
dfs(0);
int B=333;
for(int i=1, x, y; i<=q; ++i) {
cin>>x>>y;
if(post[x].size()<post[y].size()) swap(x, y);
if(post[x].size()<=B) {
buildvt(post[x], post[y]);
ret=0; dfsv(0); ans[i]=ret;
} else {
qry[rev[x]].push_back({y, i});
}
}
for(int i=1; i<=m; ++i) {
assert(i<=300);
if(post[id[i]].size()<=B) break ;
if(!qry[i].size()) continue ;
for(int j=0; j<=ACAM::tot; ++j) tag[j]=0;
for(int v:post[id[i]]) tag[v]=1;
predfs(0); predfs2(0);
int l=-1; sort(qry[i].begin(), qry[i].end());
for(int j=1; j<=m; ++j) {
if(l+1>=qry[i].size()||qry[i][l+1].first!=j) continue ;
buildvt(post[j], em);
ret=0; dfsc(0);
while(l+1<qry[i].size()&&qry[i][l+1].first==j)
l++, ans[qry[i][l].second]=ret;
}
}
for(int i=1; i<=q; ++i)
printf("%d\n", ans[i]);
return 0;
}