#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string s,t;
vector<int> lps(100);
int ans;
void calc(){
int m=s.size(),len=0;
for(int i=1;i<m;){
if(s[i]==s[len])
lps[i++]=++len;
else
if(len)
len=lps[len-1];
else
lps[i++]=0;
}
}
void kmp(){
ans=0;
calc();
int m=s.size(),n=t.size(),i=0,j=0;
while(i<n){
if(s[j]==t[i])
i++,j++;
if(j==m){
ans=m,j=lps[j-1];
return;
}
if(i==n){
ans=j;
return;
}
else if(i<n&&s[j]!=t[i])
if(j)
j=lps[j-1];
else
i++;
}
}
int main(){
int n;
for(cin>>n;n;n--){
t="";
int k,w,val=0;
for(cin>>k>>w;w;w--){
cin>>s;
kmp();
val+=s.size()-ans;
t=s;
}
cout<<val<<endl;
}
}
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string s,t;
vector<int> lps(100);
int ans;
void calc(){
int m=s.size(),len=0;
for(int i=1;i<m;){
if(s[i]==s[len])
lps[i++]=++len;
else
if(len)
len=lps[len-1];
else
lps[i++]=0;
}
}
void kmp(){
ans=0;
calc();
int m=s.size(),n=t.size(),i=0,j=0;
while(i<n){
if(s[j]==t[i])
i++,j++;
if(j==m){
ans=m,j=lps[j-1];
return;
}
if(i==n){
ans=j;
return;
}
else if(i<n&&s[j]!=t[i])
if(j)
j=lps[j-1];
else
i++;
}
}
int main(){
int n;
for(cin>>n;n;n--){
t="";
int k,w,val=0;
for(cin>>k>>w;w;w--){
cin>>s;
kmp();
val+=s.size()-ans;
t=s;
}
cout<<val<<endl;
}
}
Comments
Post a Comment