#pragma GCC optimize ("Ofast")
#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) ;
}
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 :
vector< string> stringMatching( vector< string> & S) {
int i;
dummy_main( ) ;
int N = S.size ( ) ;
vector< string> res;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
int j;
for ( j= ( 0 ) ; j< ( N) ; j++ ) {
if ( i! = j && isSubstring( S[ j] ,S[ i] ) ) {
res.push_back ( S[ i] ) ;
break ;
}
}
}
return res;
}
}
;
// cLay varsion 20200419-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// class Solution {
// public:
// vector<string> stringMatching(vector<string>& S) {
// dummy_main();
// int N = S.size();
// vector<string> res;
// rep(i,N) rep(j,N) if(i!=j && isSubstring(S[j],S[i])){
// res.push_back(S[i]);
// break;
// }
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZvaWQgKndtZW07CmNoYXIgbWVtYXJyWzk2MDAwMDAwXTsKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMWQoVCAqKmFyciwgaW50IHgsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgc3RhdGljIGludCBza2lwWzE2XSA9IHswLCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxfTsKICAoKm1lbSkgPSAodm9pZCopKCAoKGNoYXIqKSgqbWVtKSkgKyBza2lwWygodW5zaWduZWQgbG9uZyBsb25nKSgqbWVtKSkgJiAxNV0gKTsKICAoKmFycik9KFQqKSgqbWVtKTsKICAoKm1lbSk9KCgqYXJyKSt4KTsKfQppbnQgaXNTdWJzdHJpbmcoc3RyaW5nIEEsIHN0cmluZyBCLCB2b2lkICptZW0gPSB3bWVtKXsKICBpbnQgaSA9IDA7CiAgaW50IGs7CiAgaW50ICpmYWlsOwogIGNoYXIgKm07CiAgaWYoQi5zaXplKCkgPiBBLnNpemUoKSl7CiAgICByZXR1cm4gMDsKICB9CiAgd2FsbG9jMWQoJmZhaWwsIEIuc2l6ZSgpKzEsICZtZW0pOwogIGsgPSBmYWlsWzBdID0gLTE7CiAgZm9yKGk9KDApO2k8KEIuc2l6ZSgpKTtpKyspewogICAgd2hpbGUoaz49MCAmJiBCW2tdICE9IEJbaV0pewogICAgICBrID0gZmFpbFtrXTsKICAgIH0KICAgIGZhaWxbaSsxXSA9ICsrazsKICB9CiAgayA9IDA7CiAgZm9yKGk9KDApO2k8KEEuc2l6ZSgpKTtpKyspewogICAgd2hpbGUoayA+PSAwICYmIEJba10gIT0gQVtpXSl7CiAgICAgIGsgPSBmYWlsW2tdOwogICAgfQogICAgaWYoKCsraykgPT0gQi5zaXplKCkpewogICAgICByZXR1cm4gMTsKICAgIH0KICB9CiAgcmV0dXJuIDA7Cn0KI2RlZmluZSBtYWluIGR1bW15X21haW4KaW50IG1haW4oKXsKICB3bWVtID0gbWVtYXJyOwogIHJldHVybiAwOwp9CiN1bmRlZiBtYWluCmNsYXNzIFNvbHV0aW9uewogIHB1YmxpYzoKICB2ZWN0b3I8c3RyaW5nPiBzdHJpbmdNYXRjaGluZyh2ZWN0b3I8c3RyaW5nPiYgUyl7CiAgICBpbnQgaTsKICAgIGR1bW15X21haW4oKTsKICAgIGludCBOID0gUy5zaXplKCk7CiAgICB2ZWN0b3I8c3RyaW5nPiByZXM7CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgaW50IGo7CiAgICAgIGZvcihqPSgwKTtqPChOKTtqKyspewogICAgICAgIGlmKGkhPWogJiYgaXNTdWJzdHJpbmcoU1tqXSxTW2ldKSl7CiAgICAgICAgICByZXMucHVzaF9iYWNrKFNbaV0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH0KfQo7Ci8vIGNMYXkgdmFyc2lvbiAyMDIwMDQxOS0xCgovLyAtLS0gb3JpZ2luYWwgY29kZSAtLS0KLy8gI2RlZmluZSBtYWluIGR1bW15X21haW4KLy8ge30KLy8gI3VuZGVmIG1haW4KLy8gCi8vIGNsYXNzIFNvbHV0aW9uIHsKLy8gcHVibGljOgovLyAgIHZlY3RvcjxzdHJpbmc+IHN0cmluZ01hdGNoaW5nKHZlY3RvcjxzdHJpbmc+JiBTKSB7Ci8vICAgICBkdW1teV9tYWluKCk7Ci8vICAgICBpbnQgTiA9IFMuc2l6ZSgpOwovLyAgICAgdmVjdG9yPHN0cmluZz4gcmVzOwovLyAgICAgcmVwKGksTikgcmVwKGosTikgaWYoaSE9aiAmJiBpc1N1YnN0cmluZyhTW2pdLFNbaV0pKXsKLy8gICAgICAgcmVzLnB1c2hfYmFjayhTW2ldKTsKLy8gICAgICAgYnJlYWs7Ci8vICAgICB9Ci8vICAgICByZXR1cm4gcmVzOwovLyAgIH0KLy8gfTsK