#include using namespace std; int main() { /* Enter your code here. Read input from STDIN. Print output to STDOUT */ long long t,m,n,x; cin>>t; while(t--){ char ani[100009]; long long s[100009]={0}; map > en,dn; for(int i=0;i<100009;i++){ map m,m2; en[i]=m;dn[i]=m2; } cin>>m>>n; for(int i=1;i<=n;i++){ cin>>ani[i]; if(ani[i]=='M'){ ani[i]='D'; } if(ani[i]=='C'){ ani[i]='E'; } } for(int i=1;i<=n;i++){ cin>>s[i]; } for(int i=1;i<=n;i++){ cin>>x; if(ani[i]=='D'){ if(dn[x].find(s[i])!=dn[x].end() ){ dn[x][s[i]]++; } else{ dn[x][s[i]]=1; } } else{ if(en[x].find(s[i])!=en[x].end() ){ en[x][s[i]]++; } else{ en[x][s[i]]=1; } } } long long pred[100009]={0},tempd[100009]={0},pree[100009]={0},tempe[100009]={0},ans[100009]={0},ansd[100009]={0},anse[100009]={0}; // queue pree,pred; long j=1; /* for(int i=1;i ::reverse_iterator rit; for(int i=1;isecond; if(ans[rit->first]+temp>ansd[i]){ ansd[i]=ans[rit->first]+temp; pred[i]=rit->first; tempd[i]=temp; } } if(pred[i]>0) ansd[i]=max( ansd[i] , ans[ min(pred[i],pred[i-1])] +tempd[i-1]+tempd[i] ); temp=0; for(rit=en[i].rbegin();rit!=en[i].rend();rit++){ temp+=rit->second; if(ans[rit->first]+temp>anse[i]){ anse[i]=ans[rit->first]+temp; pree[i]=rit->first; tempe[i]=temp; } } if(pree[i]>0) anse[i]=max( anse[i] , ans[ min(pree[i],pree[i-1])] +tempe[i-1]+tempe[i] ); ans[i]=max(ans[i-1],max(ansd[i],anse[i]) ); //cout<