root->fail=NULL;
while(head
for(int i=0; i<26; i++){
if(tmp->next[i]){
if(tmp==root) tmp->next[i]->fail=root;
else{
Trie *p=tmp->fail;
while(p!=NULL){
if(p->next[i]){
tmp->next[i]->fail=p->next[i];
break;
}
p=p->fail;
}
if(p==NULL) tmp->next[i]->fail=root;
}
if(tmp->next[i]->fail->val) tmp->next[i]->val+=tmp->next[i]->fail->val;
if(tmp->next[i]->fail->must) tmp->next[i]->must|=tmp->next[i]->fail->must;
if(tmp->next[i]->fail->canot) tmp->next[i]->canot|=1;
que[tail++]=tmp->next[i];
}
else if(tmp==root) tmp->next[i]=root;
else tmp->next[i]=tmp->fail->next[i];
}
}
}
char str[105];
int del[2][M][1<<8];
int pot[2][M][1<<8];
void slove(){
int l=strlen(str);
mem(del[1],0x11);
mem(pot[1],0x8f);
del[1][0][0]=0;
pot[1][0][0]=0;
for(int i=0;i
mem(pot[i&1],0x8f);
for(int j=0;j
if(del[i&1][j][k]>del[(i+1)&1][j][k]+1){
del[i&1][j][k]=del[(i+1)&1][j][k]+1;
pot[i&1][j][k]=pot[(i+1)&1][j][k];
}
else if(del[i&1][j][k]==del[(i+1)&1][j][k]+1&&pot[i&1][j][k]
pot[i&1][j][k]=pot[(i+1)&1][j][k];
int id=str[i]-'a';
if(s[j].next[id]==NULL) continue;
int cur=s[j].next[id]->kind;
if(s[cur].canot) continue;
int val=s[cur].val;
int curk=k|s[cur].must;
if(del[i&1][cur][curk]>del[(i+1)&1][j][k]){
del[i&1][cur][curk]=del[(i+1)&1][j][k];
pot[i&1][cur][curk]=pot[(i+1)&1][j][k]+val;
}
else if(del[i&1][cur][curk]==del[(i+1)&1][j][k] && pot[i&1][cur][curk]
pot[i&1][cur][curk]=pot[(i+1)&1][j][k]+val;
}
}
}
}
int a1=inf,a2;
int full=(1<
a2=pot[num][i][full];
}
else if(del[num][i][full]==a1&&pot[num][i][full]>a2){
a1=del[num][i][full];
a2=pot[num][i][full];
}
}
if(a1>=inf) puts("Banned");
else printf("%d %d\n",a1,a2);
}
int n,val;
int main(){
// freopen("input.txt","r",stdin);
int t,cas=0;
scanf("%d",&t);
while(t--){
idx=0;tot=0;
scanf("%d",&n);
Trie *root=NewNode();
for(int i=0;i
Insert(root,str,strlen(str),i,val);
}
Bulid_fail(root);
scanf("%s",str);
printf("Case %d: ",++cas);
sl