#include using namespace std; #define ll long long #define rep(i,n) for (ll i=0;i<(ll)n;i++) #define rrep(i,n) for (ll i=n-1;i>=(ll)0;i--) #define loop(i,m,n) for(ll i=m;i<=(ll)n;i++) #define rloop(i,m,n) for(ll i=m;i>=(ll)n;i--) #define vl vector #define vvl vector> #define inf 4000000000000000000LL #define mod 998244353LL random_device rnd;// 非決定的な乱数生成器 mt19937 mt(rnd());// メルセンヌ・ツイスタの32ビット版、引数は初期シード template struct RollingHash{ //桁の進数 static vector> base; //桁の進数のinv static vector> baseinv; //管理のmod static ll md; vector> hash={{0,0}},rhash={{0,0}}; map table; //(HashTable) RollingHash(map h,string shokis=string()){ table=h; rep(i,shokis.size()){ push_back(shokis[i]); } } //push_backは1文ずつ入れる時に使う。初期化はコンストラクタ。 void push_back(T c){ if(base.size()==hash.size()){ base.push_back({(base.back().first*base[1].first)%md,(base.back().second*base[1].second)%md}); baseinv.push_back({(baseinv.back().first*baseinv[1].first)%md,(baseinv.back().second*baseinv[1].second)%md}); } ll tmp=hash.size()-1; hash.push_back({(hash[tmp].first+base[tmp].first*table[c])%md,(hash[tmp].second+base[tmp].second*table[c])%md}); rhash.push_back({(rhash[tmp].first*base[1].first+table[c])%md,(rhash[tmp].second*base[1].second+table[c])%md}); } void pop_back(){ hash.pop_back(); rhash.pop_back(); } //閉区間[l,r] pair get_hash(ll l,ll r){ if(rans={0LL,0LL}; return(ans); } r++; pair ans={((hash[r].first-hash[l].first+md)*baseinv[l].first)%md,((hash[r].second-hash[l].second+md)*baseinv[l].second)%md}; return ans; } //閉区間[l,r] pair get_revhash(ll l,ll r){ if(rans={0LL,0LL}; return(ans); } r++; pair ans={(rhash[r].first-((rhash[l].first*base[r-l].first)%md)+md)%md,(rhash[r].second-((rhash[l].second*base[r-l].second)%md)+md)%md}; return ans; } //閉区間[l,r]が回文か判定する bool ispalindrome(ll l,ll r){ pair obv=get_hash(l,r); pair rev=get_revhash(l,r); return obv==rev; } ll size(){ return hash.size()-1; } }; template vector> RollingHash::base = {{1,1},{999999929,999999937}}; template vector> RollingHash::baseinv = {{1,1},{209585860,189774042}}; template ll RollingHash::md = 1048828087; map table; map,ll> totyu,ng; void dfs(RollingHash & ans,string & rowans,ll k){ if(ans.size()!=0){ if(ng[ans.get_hash(0,ans.size()-1)]>=k)return; if(totyu[ans.get_hash(0,ans.size()-1)]>n>>m; rep(i,n){ string ss; cin>>ss; RollingHash s(table,ss); rep(j,s.size())totyu[s.get_hash(0,j)]++; ng[s.get_hash(0,s.size()-1)]++; } RollingHash ans(table); string rowans; dfs(ans,rowans,n-m+1); cout<<"No"<