3080 Blue Jeans
問題概要
60文字のG,A,T,Cからなる塩基配列がn個与えられる。
n個全てに共通する連続する塩基配列で、最も長いものを求めよ。
複数ある場合はアルファベット順で最も最初に来るものを求めよ。
n≦10を満たす。
解法
サイズが小さいので特別なマッチングのアルゴリズムなどは不要。
部分文字列を全通り試す。
といってもサイズが大きい場合はどう工夫するんだろう。
マッチングにKMPなどを使うくらいの改良しか思い浮かばない。
ソースコード
string in[10]; int main() { int n,T; cin>>T; rep(U,T){ cin>>n; cin.ignore(); rep(i,n)getline(cin,in[i]); for(int w=60;w>=3;w--){ string ans; rep(l,61-w){ string ptn=in[0].substr(l,w); for(int i=1;i<n;i++)if(in[i].find(ptn)==string::npos)goto FAIL; if(ans.empty()||ptn<ans)ans=ptn; FAIL:; } if(!ans.empty()){ puts(ans.c_str()); goto END; } } puts("no significant commonalities"); END:; } return 0; }