#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("inline")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
char memarr[ 96000000 ] ;
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
template < class T> inline void walloc1d( T ** arr, int x1, int x2, void ** mem = & wmem) {
walloc1d( arr, x2- x1, mem) ;
( * arr) - = x1;
}
int isSubstring( string A, string B, void * mem = wmem) {
int i = 0 ;
int k;
int * fail;
char * m;
if ( B.size ( ) > A.size ( ) ) {
return 0 ;
}
walloc1d( & fail, B.size ( ) + 1 , & mem) ;
k = fail[ 0 ] = - 1 ;
for ( i= ( 0 ) ; i< ( B.size ( ) ) ; i++ ) {
while ( k>= 0 && B[ k] ! = B[ i] ) {
k = fail[ k] ;
}
fail[ i+ 1 ] = ++ k;
}
k = 0 ;
for ( i= ( 0 ) ; i< ( A.size ( ) ) ; i++ ) {
while ( k >= 0 && B[ k] ! = A[ i] ) {
k = fail[ k] ;
}
if ( ( ++ k) == B.size ( ) ) {
return 1 ;
}
}
return 0 ;
}
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
class Solution{
public :
int numOfStrings( vector< string> & patterns, string word) {
dummy_main( ) ;
int res = 0 ;
for ( auto s : patterns) {
res + = isSubstring( word, s) ;
}
return res;
}
}
;
// cLay version 20210816-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// class Solution {
// public:
// int numOfStrings(vector<string>& patterns, string word) {
// dummy_main();
// int res = 0;
// for(auto s : patterns) res += isSubstring(word, s);
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0IikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJpbmxpbmUiKQojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp2b2lkKndtZW07CmNoYXIgbWVtYXJyWzk2MDAwMDAwXTsKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMWQoVCAqKmFyciwgaW50IHgsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgc3RhdGljIGludCBza2lwWzE2XSA9IHswLCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxfTsKICAoKm1lbSkgPSAodm9pZCopKCAoKGNoYXIqKSgqbWVtKSkgKyBza2lwWygodW5zaWduZWQgbG9uZyBsb25nKSgqbWVtKSkgJiAxNV0gKTsKICAoKmFycik9KFQqKSgqbWVtKTsKICAoKm1lbSk9KCgqYXJyKSt4KTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgdm9pZCB3YWxsb2MxZChUICoqYXJyLCBpbnQgeDEsIGludCB4Miwgdm9pZCAqKm1lbSA9ICZ3bWVtKXsKICB3YWxsb2MxZChhcnIsIHgyLXgxLCBtZW0pOwogICgqYXJyKSAtPSB4MTsKfQppbnQgaXNTdWJzdHJpbmcoc3RyaW5nIEEsIHN0cmluZyBCLCB2b2lkICptZW0gPSB3bWVtKXsKICBpbnQgaSA9IDA7CiAgaW50IGs7CiAgaW50KmZhaWw7CiAgY2hhciptOwogIGlmKEIuc2l6ZSgpID4gQS5zaXplKCkpewogICAgcmV0dXJuIDA7CiAgfQogIHdhbGxvYzFkKCZmYWlsLCBCLnNpemUoKSsxLCAmbWVtKTsKICBrID0gZmFpbFswXSA9IC0xOwogIGZvcihpPSgwKTtpPChCLnNpemUoKSk7aSsrKXsKICAgIHdoaWxlKGs+PTAgJiYgQltrXSAhPSBCW2ldKXsKICAgICAgayA9IGZhaWxba107CiAgICB9CiAgICBmYWlsW2krMV0gPSArK2s7CiAgfQogIGsgPSAwOwogIGZvcihpPSgwKTtpPChBLnNpemUoKSk7aSsrKXsKICAgIHdoaWxlKGsgPj0gMCAmJiBCW2tdICE9IEFbaV0pewogICAgICBrID0gZmFpbFtrXTsKICAgIH0KICAgIGlmKCgrK2spID09IEIuc2l6ZSgpKXsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgfQogIHJldHVybiAwOwp9CiNkZWZpbmUgbWFpbiBkdW1teV9tYWluCmludCBtYWluKCl7CiAgd21lbSA9IG1lbWFycjsKICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgaW50IG51bU9mU3RyaW5ncyh2ZWN0b3I8c3RyaW5nPiYgcGF0dGVybnMsIHN0cmluZyB3b3JkKXsKICAgIGR1bW15X21haW4oKTsKICAgIGludCByZXMgPSAwOwogICAgZm9yKGF1dG8gcyA6IHBhdHRlcm5zKXsKICAgICAgcmVzICs9IGlzU3Vic3RyaW5nKHdvcmQsIHMpOwogICAgfQogICAgcmV0dXJuIHJlczsKICB9Cn0KOwovLyBjTGF5IHZlcnNpb24gMjAyMTA4MTYtMQoKLy8gLS0tIG9yaWdpbmFsIGNvZGUgLS0tCi8vICNkZWZpbmUgbWFpbiBkdW1teV9tYWluCi8vIHt9Ci8vICN1bmRlZiBtYWluCi8vIAovLyBjbGFzcyBTb2x1dGlvbiB7Ci8vIHB1YmxpYzoKLy8gICBpbnQgbnVtT2ZTdHJpbmdzKHZlY3RvcjxzdHJpbmc+JiBwYXR0ZXJucywgc3RyaW5nIHdvcmQpIHsKLy8gICAgIGR1bW15X21haW4oKTsKLy8gICAgIGludCByZXMgPSAwOwovLyAgICAgZm9yKGF1dG8gcyA6IHBhdHRlcm5zKSByZXMgKz0gaXNTdWJzdHJpbmcod29yZCwgcyk7Ci8vICAgICByZXR1cm4gcmVzOwovLyAgIH0KLy8gfTsK