#include<bits/stdc++.h>
using namespace std;
/*#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
/*template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
*/ typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair< ll,ll> pl;
typedef pair< int ,int > pii;
#define LOCAL 0
#define dbg(x) cout << #x << " is " << x << "\n"
#define gll(x) scanf("%d",&x)
#define gll2(x,y) scanf("%d%d",&x,&y)
#define gll3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define gllarr(arr,n) f(i,n) gll(arr[i]);
#define sz(x) ((int)x.size())
#define s(x) sort(x.begin(),x.end())
#define all(v) v.begin(),v.end()
#define rs(v) { s(v) ; r(v) ; }
#define r(v) {reverse(all(v));}
#define pb push_back
#define f(i,n) for(int i=0;i<n;i++)
#define fr(i,n) for(int i=n-1;i>=0;i--)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define repr(i,a,b) for(int i=a;i>=b;i--)
const ll mod = ( ll) 1e9 + 7 ;
const ll inf = ( ll) 1e16 ;
const ld eps = 1e-12 ;
const ll N = ( int ) 1e4 + 5 ;
const ll LOGN = 19 ;
const ld PI = 3.14159265358979323846 ;
inline ll mul( ll a, ll b, ll m = mod) { return ( ll) ( a * b) % m; }
inline ll add( ll a, ll b, ll m = mod) { a + = b; if ( a >= m) a - = m; if ( a < 0 ) a + = m; return a; }
inline ll power( ll a, ll b, ll m = mod) { if ( b == 0 ) return 1 ; if ( b == 1 ) return ( a % m) ; ll x = power( a, b / 2 , m) ; x = mul( x, x, m) ; if ( b % 2 ) x = mul( x, a, m) ; return x; }
inline int index( char c) {
return ( ( int ) c - ( int ) 'a' + 1 ) ;
}
ll powers[ 35 ] ;
void pre( )
{
powers[ 0 ] = 1ll;
rep( i, 1 , 30 ) powers[ i] = powers[ i - 1 ] * 4ll;
//for(int i = 0; i < 34; i++) cout<<invpowers[i]<<" ";
}
struct node{
ll val;
int index;
node( ) { }
inline void merge( node l, node r)
{
if ( l.val > r.val )
{
val = l.val ;
index = l.index ;
}
else if ( l.val == r.val )
{
val = l.val ;
index = min( l.index , r.index ) ;
}
else
{
val = r.val ;
index = r.index ;
}
}
inline void no_use( )
{
val = LONG_LONG_MIN;
index = - 1 ;
}
} ;
int num[ N] ;
node segtree[ 4 * N] ;
void build( int nd, int start, int end)
{
if ( start == end)
{
segtree[ nd] .val = num[ start] ;
segtree[ nd] .index = start;
return ;
}
int mid = ( start + end) >> 1 ;
build( 2 * nd + 1 , start, mid) ;
build( 2 * nd + 2 , mid + 1 , end) ;
segtree[ nd] .merge ( segtree[ 2 * nd + 1 ] , segtree[ 2 * nd + 2 ] ) ;
}
node query( int nd, int start, int end, int qs, int qe)
{
if ( end < qs || start > qe || start > end)
{
node temp;
temp.no_use ( ) ;
return temp;
}
if ( start >= qs && end <= qe) return segtree[ nd] ;
node p,q;
int mid = ( start + end) >> 1 ;
p = query( 2 * nd + 1 , start, mid, qs, qe) ;
q = query( 2 * nd + 2 , mid + 1 , end, qs, qe) ;
node ret;
ret.merge ( p,q) ;
return ret;
}
int main( ) {
ios_base:: sync_with_stdio ( false ) ;
cin .tie ( NULL ) ;
if ( LOCAL) {
freopen ( "C:\\ Users\\ Dishant\\ Desktop\\ Collection-DEV c++\\ input.txt" , "r" , stdin ) ;
freopen ( "C:\\ Users\\ Dishant\\ Desktop\\ Collection-DEV c++\\ output.txt" , "w" , stdout ) ;
}
int t;
cin >> t;
pre( ) ;
while ( t-- )
{
int n,q;
cin >> n>> q;
string s;
unordered_map< ll, int > mp;
f( i,n) {
cin >> s;
int len = s.length ( ) ;
num[ i] + = len;
ll prefix_hash[ len + 2 ] = { 0 } ;
ll suffix_hash[ len + 2 ] = { 0 } ;
prefix_hash[ 0 ] = index( s[ 0 ] ) ;
suffix_hash[ len - 1 ] = index( s[ len - 1 ] ) ;
rep( j, 1 , len - 1 ) {
prefix_hash[ j] = prefix_hash[ j - 1 ] + ( index( s[ j] ) * powers[ j] ) ;
}
//Suffix
for ( int j = len - 2 ; j >= 0 ; j-- ) {
suffix_hash[ j] = suffix_hash[ j + 1 ] + ( index( s[ j] ) * powers[ len - j - 1 ] ) ;
}
mp[ prefix_hash[ len - 1 ] ] = i;
// f(j,len) cout<<prefix_hash[j]<<" ";
// cout<<endl;
// f(j,len) cout<<suffix_hash[j]<<' ';
// cout<<endl;
//Count 1 length also;
rep( R, 1 , len - 1 ) {
ll fir = prefix_hash[ R] ;
ll sec = ( suffix_hash[ 0 ] - suffix_hash[ R + 1 ] ) / powers[ len - 1 - R] ;
//cout<<"0th na"<<fir<<" "<<sec<<endl;
if ( fir == sec)
num[ i] ++ ;
}
rep( L, 1 , len - 1 ) {
rep( R, L + 1 , len - 1 ) {
ll sidha = ( prefix_hash[ R] - prefix_hash[ L - 1 ] ) / powers[ L] ;
ll ulta = ( suffix_hash[ L] - suffix_hash[ R + 1 ] ) / powers[ len - 1 - R] ;
//cout<<"In: "<<sidha<<" "<<ulta<<endl;
if ( sidha == ulta)
num[ i] ++ ;
}
}
}
//f(i,n) cout<<num[i]<<" ";
build( 0 ,0 ,n- 1 ) ;
while ( q-- )
{
string l,r;
cin >> l>> r;
int len = l.length ( ) ;
ll prefix_hash[ len + 2 ] = { 0 } ;
prefix_hash[ 0 ] = index( l[ 0 ] ) ;
rep( j,1 ,len - 1 )
{
prefix_hash[ j] = ( prefix_hash[ j - 1 ] + ( index( l[ j] ) * powers[ j] ) ) ;
}
int L = mp[ prefix_hash[ len - 1 ] ] ;
len = r.length ( ) ;
ll prefix_hash2[ len + 2 ] = { 0 } ;
prefix_hash2[ 0 ] = index( r[ 0 ] ) ;
rep( j, 1 , len - 1 )
{
prefix_hash2[ j] = prefix_hash2[ j - 1 ] + ( index( r[ j] ) * powers[ j] ) ;
}
int R = mp[ prefix_hash2[ len - 1 ] ] ;
node ans = query( 0 , 0 , n - 1 , L, R) ;
cout << ans.index + 1 << "\n " ;
}
}
return 0 ;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLyojaW5jbHVkZTxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KI2luY2x1ZGU8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7Ci8qdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnVzaW5nIG9yZGVyZWRfc2V0ID0gdHJlZTxULCBudWxsX3R5cGUsIGxlc3M8VD4sIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU+OwoqL3R5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGw7CnR5cGVkZWYgbG9uZyBkb3VibGUgbGQ7CnR5cGVkZWYgcGFpcjxsbCxsbD4gcGw7CnR5cGVkZWYgcGFpcjxpbnQsaW50PiBwaWk7CgojZGVmaW5lIExPQ0FMIDAKI2RlZmluZSBkYmcoeCkgY291dCA8PCAjeCA8PCAiIGlzICIgPDwgeCA8PCAiXG4iCiNkZWZpbmUgZ2xsKHgpIHNjYW5mKCIlZCIsJngpCiNkZWZpbmUgZ2xsMih4LHkpIHNjYW5mKCIlZCVkIiwmeCwmeSkKI2RlZmluZSBnbGwzKHgseSx6KSBzY2FuZigiJWQlZCVkIiwmeCwmeSwmeikKI2RlZmluZSBnbGxhcnIoYXJyLG4pIGYoaSxuKSBnbGwoYXJyW2ldKTsKI2RlZmluZSBzeih4KSAoKGludCl4LnNpemUoKSkKI2RlZmluZSBzKHgpIHNvcnQoeC5iZWdpbigpLHguZW5kKCkpCiNkZWZpbmUgYWxsKHYpIHYuYmVnaW4oKSx2LmVuZCgpCiNkZWZpbmUgcnModikgeyBzKHYpIDsgcih2KSA7IH0KI2RlZmluZSByKHYpIHtyZXZlcnNlKGFsbCh2KSk7fQojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGYoaSxuKSBmb3IoaW50IGk9MDtpPG47aSsrKQojZGVmaW5lIGZyKGksbikgZm9yKGludCBpPW4tMTtpPj0wO2ktLSkKI2RlZmluZSByZXAoaSxhLGIpIGZvcihpbnQgaT1hO2k8PWI7aSsrKQojZGVmaW5lIHJlcHIoaSxhLGIpIGZvcihpbnQgaT1hO2k+PWI7aS0tKQoKY29uc3QgbGwgbW9kID0gKGxsKTFlOSArIDc7CmNvbnN0IGxsIGluZiA9IChsbCkxZTE2Owpjb25zdCBsZCBlcHMgPSAxZS0xMjsKY29uc3QgbGwgTiA9IChpbnQpMWU0ICsgNTsKY29uc3QgbGwgTE9HTiA9IDE5Owpjb25zdCBsZCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7CmlubGluZSBsbCBtdWwobGwgYSwgbGwgYiwgbGwgbSA9IG1vZCkgeyByZXR1cm4gKGxsKShhICogYikgJSBtO30KaW5saW5lIGxsIGFkZChsbCBhLCBsbCBiLCBsbCBtID0gbW9kKSB7IGEgKz0gYjsgaWYoYSA+PSBtKSBhIC09IG07IGlmKGEgPCAwKSBhICs9IG07IHJldHVybiBhO30KaW5saW5lIGxsIHBvd2VyKGxsIGEsIGxsIGIsIGxsIG0gPSBtb2QpIHsgaWYoYiA9PSAwKSByZXR1cm4gMTsgaWYoYiA9PSAxKSByZXR1cm4gKGEgJSBtKTsgbGwgeCA9IHBvd2VyKGEsIGIgLyAyLCBtKTsgeCA9IG11bCh4LCB4LCBtKTsgaWYoYiAlIDIpIHggPSBtdWwoeCwgYSwgbSk7IHJldHVybiB4O30KCmlubGluZSBpbnQgaW5kZXgoY2hhciBjKSB7CiAgICByZXR1cm4gKChpbnQpIGMgLSAoaW50KSAnYScgKyAxKTsKfQoKbGwgcG93ZXJzWzM1XTsKCnZvaWQgcHJlKCkKewogICAgcG93ZXJzWzBdID0gMWxsOwogICAgcmVwKGksIDEsIDMwKSBwb3dlcnNbaV0gPSBwb3dlcnNbaSAtIDFdICogNGxsOwogICAgLy9mb3IoaW50IGkgPSAwOyBpIDwgMzQ7IGkrKykgY291dDw8aW52cG93ZXJzW2ldPDwiICI7Cn0KCnN0cnVjdCBub2RlewogICAgbGwgdmFsOwogICAgaW50IGluZGV4OwogICAgbm9kZSgpIHt9CiAgICBpbmxpbmUgdm9pZCBtZXJnZShub2RlIGwsIG5vZGUgcikKICAgIHsKICAgICAgICBpZihsLnZhbCA+IHIudmFsKQogICAgICAgIHsKICAgICAgICAgICAgdmFsID0gbC52YWw7CiAgICAgICAgICAgIGluZGV4ID0gbC5pbmRleDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihsLnZhbCA9PSByLnZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHZhbCA9IGwudmFsOwogICAgICAgICAgICBpbmRleCA9IG1pbihsLmluZGV4LCByLmluZGV4KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdmFsID0gci52YWw7CiAgICAgICAgICAgIGluZGV4ID0gci5pbmRleDsKICAgICAgICB9CiAgICB9CgogICAgaW5saW5lIHZvaWQgbm9fdXNlKCkKICAgIHsKICAgICAgICB2YWwgPSBMT05HX0xPTkdfTUlOOwogICAgICAgIGluZGV4ID0gLTE7CiAgICB9Cn07CgppbnQgbnVtW05dOwpub2RlIHNlZ3RyZWVbNCAqIE5dOwoKdm9pZCBidWlsZChpbnQgbmQsIGludCBzdGFydCwgaW50IGVuZCkKewogICAgaWYoc3RhcnQgPT0gZW5kKQogICAgewogICAgICAgIHNlZ3RyZWVbbmRdLnZhbCA9IG51bVtzdGFydF07CiAgICAgICAgc2VndHJlZVtuZF0uaW5kZXggPSBzdGFydDsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgbWlkID0gKHN0YXJ0ICsgZW5kKSA+PiAxOwogICAgYnVpbGQoMiAqIG5kICsgMSwgc3RhcnQsIG1pZCk7CiAgICBidWlsZCgyICogbmQgKyAyLCBtaWQgKyAxLCBlbmQpOwogICAgc2VndHJlZVtuZF0ubWVyZ2Uoc2VndHJlZVsyICogbmQgKyAxXSwgc2VndHJlZVsyICogbmQgKyAyXSk7Cn0KCm5vZGUgcXVlcnkoaW50IG5kLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBxcywgaW50IHFlKQp7CiAgICBpZihlbmQgPCBxcyB8fCBzdGFydCA+IHFlIHx8IHN0YXJ0ID4gZW5kKQogICAgewogICAgICAgIG5vZGUgdGVtcDsKICAgICAgICB0ZW1wLm5vX3VzZSgpOwogICAgICAgIHJldHVybiB0ZW1wOwogICAgfQogICAgaWYoc3RhcnQgPj0gcXMgJiYgZW5kIDw9IHFlKSByZXR1cm4gc2VndHJlZVtuZF07CiAgICBub2RlIHAscTsKICAgIGludCBtaWQgPSAoc3RhcnQgKyBlbmQpID4+IDE7CiAgICBwID0gcXVlcnkoMiAqIG5kICsgMSwgc3RhcnQsIG1pZCwgcXMsIHFlKTsKICAgIHEgPSBxdWVyeSgyICogbmQgKyAyLCBtaWQgKyAxLCBlbmQsIHFzLCBxZSk7CiAgICBub2RlIHJldDsKICAgIHJldC5tZXJnZShwLHEpOwogICAgcmV0dXJuIHJldDsKfQoKaW50IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CiAgICBpZiAoTE9DQUwpIHsKICAgICAgICBmcmVvcGVuKCJDOlxcVXNlcnNcXERpc2hhbnRcXERlc2t0b3BcXENvbGxlY3Rpb24tREVWIGMrK1xcaW5wdXQudHh0IiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbigiQzpcXFVzZXJzXFxEaXNoYW50XFxEZXNrdG9wXFxDb2xsZWN0aW9uLURFViBjKytcXG91dHB1dC50eHQiLCAidyIsIHN0ZG91dCk7CiAgICB9CiAgICBpbnQgdDsKICAgIGNpbj4+dDsKICAgIHByZSgpOwogICAgd2hpbGUodC0tKQogICAgewogICAgICAgIGludCBuLHE7CiAgICAgICAgY2luPj5uPj5xOwogICAgICAgIHN0cmluZyBzOwogICAgICAgIHVub3JkZXJlZF9tYXA8bGwsIGludD4gbXA7CiAgICAgICAgZihpLG4pIHsKICAgICAgICAgICAgY2luID4+IHM7CiAgICAgICAgICAgIGludCBsZW4gPSBzLmxlbmd0aCgpOwogICAgICAgICAgICBudW1baV0gKz0gbGVuOwogICAgICAgICAgICBsbCBwcmVmaXhfaGFzaFtsZW4gKyAyXSA9IHswfTsKICAgICAgICAgICAgbGwgc3VmZml4X2hhc2hbbGVuICsgMl0gPSB7MH07CiAgICAgICAgICAgIHByZWZpeF9oYXNoWzBdID0gaW5kZXgoc1swXSk7CiAgICAgICAgICAgIHN1ZmZpeF9oYXNoW2xlbiAtIDFdID0gaW5kZXgoc1tsZW4gLSAxXSk7CiAgICAgICAgICAgIHJlcChqLCAxLCBsZW4gLSAxKSB7CiAgICAgICAgICAgICAgICBwcmVmaXhfaGFzaFtqXSA9IHByZWZpeF9oYXNoW2ogLSAxXSArIChpbmRleChzW2pdKSAqIHBvd2Vyc1tqXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9TdWZmaXgKICAgICAgICAgICAgZm9yIChpbnQgaiA9IGxlbiAtIDI7IGogPj0gMDsgai0tKSB7CiAgICAgICAgICAgICAgICBzdWZmaXhfaGFzaFtqXSA9IHN1ZmZpeF9oYXNoW2ogKyAxXSArIChpbmRleChzW2pdKSAqIHBvd2Vyc1tsZW4gLSBqIC0gMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1wW3ByZWZpeF9oYXNoW2xlbiAtIDFdXSA9IGk7Ci8vICAgICAgICAgICAgZihqLGxlbikgY291dDw8cHJlZml4X2hhc2hbal08PCIgIjsKLy8gICAgICAgICAgICBjb3V0PDxlbmRsOwovLyAgICAgICAgICAgIGYoaixsZW4pIGNvdXQ8PHN1ZmZpeF9oYXNoW2pdPDwnICc7Ci8vICAgICAgICAgICAgY291dDw8ZW5kbDsKICAgICAgICAgICAgLy9Db3VudCAxIGxlbmd0aCBhbHNvOwogICAgICAgICAgICByZXAoUiwgMSwgbGVuIC0gMSkgewogICAgICAgICAgICAgICAgbGwgZmlyID0gcHJlZml4X2hhc2hbUl07CiAgICAgICAgICAgICAgICBsbCBzZWMgPSAoc3VmZml4X2hhc2hbMF0gLSBzdWZmaXhfaGFzaFtSICsgMV0pIC8gcG93ZXJzW2xlbiAtIDEgLSBSXTsKICAgICAgICAgICAgICAgIC8vY291dDw8IjB0aCBuYSI8PGZpcjw8IiAiPDxzZWM8PGVuZGw7CiAgICAgICAgICAgICAgICBpZiAoZmlyID09IHNlYykKICAgICAgICAgICAgICAgICAgICBudW1baV0rKzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXAoTCwgMSwgbGVuIC0gMSkgewogICAgICAgICAgICAgICAgcmVwKFIsIEwgKyAxLCBsZW4gLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgbGwgc2lkaGEgPSAocHJlZml4X2hhc2hbUl0gLSBwcmVmaXhfaGFzaFtMIC0gMV0pIC8gcG93ZXJzW0xdOwogICAgICAgICAgICAgICAgICAgIGxsIHVsdGEgPSAoc3VmZml4X2hhc2hbTF0gLSBzdWZmaXhfaGFzaFtSICsgMV0pIC8gcG93ZXJzW2xlbiAtIDEgLSBSXTsKICAgICAgICAgICAgICAgICAgICAvL2NvdXQ8PCJJbjogIjw8c2lkaGE8PCIgIjw8dWx0YTw8ZW5kbDsKICAgICAgICAgICAgICAgICAgICBpZiAoc2lkaGEgPT0gdWx0YSkKICAgICAgICAgICAgICAgICAgICAgICAgbnVtW2ldKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy9mKGksbikgY291dDw8bnVtW2ldPDwiICI7CiAgICAgICAgYnVpbGQoMCwwLG4tMSk7CiAgICAgICAgd2hpbGUocS0tKQogICAgICAgIHsKICAgICAgICAgICAgc3RyaW5nIGwscjsKICAgICAgICAgICAgY2luPj5sPj5yOwogICAgICAgICAgICBpbnQgbGVuID0gbC5sZW5ndGgoKTsKICAgICAgICAgICAgbGwgcHJlZml4X2hhc2hbbGVuICsgMl0gPSB7MH07CiAgICAgICAgICAgIHByZWZpeF9oYXNoWzBdID0gaW5kZXgobFswXSk7CiAgICAgICAgICAgIHJlcChqLDEsbGVuIC0gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJlZml4X2hhc2hbal0gPSAocHJlZml4X2hhc2hbaiAtIDFdKyAoaW5kZXgobFtqXSkgKiBwb3dlcnNbal0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbnQgTCA9IG1wW3ByZWZpeF9oYXNoW2xlbiAtIDFdXTsKICAgICAgICAgICAgbGVuID0gci5sZW5ndGgoKTsKICAgICAgICAgICAgbGwgcHJlZml4X2hhc2gyW2xlbiArIDJdID0gezB9OwogICAgICAgICAgICBwcmVmaXhfaGFzaDJbMF0gPSBpbmRleChyWzBdKTsKICAgICAgICAgICAgcmVwKGosIDEsIGxlbiAtIDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByZWZpeF9oYXNoMltqXSA9IHByZWZpeF9oYXNoMltqIC0gMV0gKyAoaW5kZXgocltqXSkgKiBwb3dlcnNbal0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGludCBSID0gbXBbcHJlZml4X2hhc2gyW2xlbiAtIDFdXTsKICAgICAgICAgICAgbm9kZSBhbnMgPSBxdWVyeSgwLCAwLCBuIC0gMSwgTCwgUik7CiAgICAgICAgICAgIGNvdXQ8PGFucy5pbmRleCArIDE8PCJcbiI7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0=