#include<bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f3f3fll
#define eps 1e-6
#define LL long long
#define pb push_back
#define fi first
#define se second
#define cl clear
#define si size
#define lb lower_bound
#define ub upper_bound
#define bug(x) cerr<<#x<<" : "<<x<<endl
#define mem(x) memset(x,0,sizeof x)
#define sc(x) scanf("%d",&x)
#define scc(x,y) scanf("%d%d",&x,&y)
#define sccc(x,y,z) scanf("%d%d%d",&x,&y,&z)
using namespace std;
const int N = 1e5 + 10;
const int mod = 998244353;
const int inv26 = 729486258;
int tot,cur;
struct node{int ch[26],len,fa;} T[N<<3];
void init(int l){cur=tot=1;memset(T,0,sizeof(T[0])*(++l));}
inline int ins(int x,int id)
{
int p=cur;cur=++tot;T[cur].len=id;
for(;p&&!T[p].ch[x];p=T[p].fa) T[p].ch[x]=cur;
if (!p) {T[cur].fa=1;return cur;}int q=T[p].ch[x];
if (T[p].len+1==T[q].len) {T[cur].fa=q;return cur;}
int np=++tot; memcpy(T[np].ch,T[q].ch,sizeof(T[q].ch));
T[np].fa=T[q].fa; T[q].fa=T[cur].fa=np; T[np].len=T[p].len+1;
for(;p&&T[p].ch[x]==q;p=T[p].fa) T[p].ch[x]=np; return cur;
}
char s[N];
int a[N],sum[N<<1];
int main()
{
int TT; sc(TT);
while(TT--)
{
int l,k,m,n,ans=0;
scc(l,k); scc(n,m);
init((l+m)<<1);
scanf("%s",s+1);
for(int i=0;i<=k;i++) sc(a[i]);
sum[0]=a[0];
for(int i=1,inv=1;i<=min(n,l+m);i++)
{
int ss=0;
for(int j=0,pw=1;j<=k;j++,pw=(LL)pw*i%mod)
ss=(ss+(LL)a[j]*pw%mod)%mod;
inv=(LL)inv*inv26%mod;
sum[i]=(LL)ss*(n-i+1)%mod*inv%mod;
sum[i]=(sum[i]+sum[i-1])%mod;
if (i>l) continue;
int tmp=ins(s[i]-'a',i);
int r=min(T[tmp].len,n);
int l=min(T[T[tmp].fa].len,n);
ans=((ans+sum[r]-sum[l])%mod+mod)%mod;
}
printf("%d\n",ans);
while(m--)
{
scanf("%s",s);
int tmp=ins(s[0]-'a',++l);
int r=min(T[tmp].len,n);
int l=min(T[T[tmp].fa].len,n);
ans=((ans+sum[r]-sum[l])%mod+mod)%mod;
printf("%d\n",ans);
}
}
}