ストリング
時間制限:2000/1000 MS(Javaの/その他)メモリの制限:32768分の65536 K(Javaの/その他)
の合計提出(S):13779受理提出(S):6689
http://acm.hdu.edu.cn/ showproblem.php?PID = 1238
問題の説明
あなたはX、またはその逆のいずれかが与えられた文字列のいずれかの部分文字列として求めることができるように、最大の文字列Xを見つけ、アルファベットの大文字と小文字を区別した文字列の数を与えられています。
入力
入力ファイルの最初の行は、単一の整数t(1 <= T <= 10)、各テストケースのための入力データに続くテストケースの数を含んでいます。各テストケースの最初の行は、単一の整数N(1 <= N <= 100)が含まれ、n行に続く所定の列の数、最小の長さは1、最大長100のそれぞれ表す1つの文字列は、余分はありません文字列の前後の空白。
出力
見つかった最大の文字列の長さを含むテストケースごとに1行があるはずです。
サンプル入力
2 3 ABCD BCDFF BRCD 2蘭バラ
サンプル出力
2 2
#include <cstdioを> する#include <CStringの> する#include <アルゴリズム> の#include <iostreamの> 使用して 名前空間STD。 CONSTの INT MAXN = 100 + 3 。 チャーSTR [MAXN]。 文字列ansstr、SS。 文字列STR2 [MAXN]。 int型T、N。 INT メイン(){ scanf関数(" %のD "、&T)。 一方、(t-- ){ scanf関数(" %のD "、&N) 以下のための(int型i = 0 ; iがn <; iは++ ){ scanf関数(" %sの" 、STR)。 STR2 [I] = STR。 } 文字列 TEMP = STR2 [ 0 ]。 INT LEN = temp.size()。 int型 ANS = 0 ; 以下のために(int型 i = 0 ; iがLEN <; iは++ ){ ための(int型、J = 1、J + iが<= LENあり、j ++ ){ int型の CNT = 1 。 SS =temp.substr(i、j)は、 用(int型のk = 1 ; K <N; ++ k個){ 場合(STR2 [K] .find(SS)=! - 1 ){ CNTを ++ 。 } } もし(CNT == N){ 場合(ANS < J){ ANS = J。 ansstr = SS。 } そう であれば(ANS ==のJ){ ansstr = 分(ansstr、SS)。 } } } } (temp.begin()、temp.end())を逆; 以下のために(int型 i = 0 ; iがLEN <; iは++ ){ ための(int型、J = 1、J + iが<= LENあり、j ++ ){ int型の CNT = 1 。 SS = temp.substr(i、j)は、 用(int型のk = 1 ; K <N; ++ k個){ 場合(STR2 [K] .find(SS)=! - 1 ){ CNTを ++; } } もし(CNT == N){ 場合(年齢< J){ 歳 = J。 ansstr = SS。 } そうで あれば(年== J){ ansstr = 分(ansstr、SS)。 } } } } のprintf(" %d個の\ n " 、年)。 } }
書式#include <stdio.hに> //网上大佬的代码 する#include <アルゴリズム> 書式#include <iostreamの> の#include < 文字列の.h> 使用して 名前空間はstd; const int型 MAXN = 105 ; チャーSTR [MAXN]。 文字列ansstr。 文字列STR2 [MAXN]。 INT のmain() { int型N、T。 scanf関数(" %のD "、&T)。 一方、(t-- ) { scanf関数(" %のD "、&N) ために(int型 I = 0 ; iがN <; Iは++ ) { scanf関数(" %sの" 、STR)。 STR2 [I] = STR。 } INT ANS = 0 。 文字列 TMP = STR2 [ 0 ]。 INT tmplen = tmp.size()。 以下のために(int型 i = 0 ; iは<tmplen; iは++ ) { ため(int型の J = 1 ; iは+ J <= tmplenあり、j ++ ) { int型の CNT = 1; 文字列 SS = tmp.substr(i、j)は、 用(int型のk = 1 k個++; N <K ) { 場合(!STR2は、[K] .find(SS)= - 1 ) CNT ++ 。 } であれば(CNT == N) { 場合(ANS < J) { ANS = J。 ansstr = SS。 } それ以外の 場合(ANS ==のJ) { ansstr = 分(ansstr、SS); } } } } リバース(tmp.begin()、tmp.end()); // リバース()は区間[BEG、エンド)全て逆内の要素であろう。 ため(INT私は= 0 ;私は<tmplen; I ++ ) { ため(INT J = 1 ; Iは、Jを+ <= tmplen; J ++ ) { int型 = CNTを1。; 文字列 SS = tmp.substr(I、J) のための(int型 K =1 ; K <N-、K ++) { もし!(STR2 [K] .find(SS)= - 1 ) CNT ++ 。 } であれば(CNT == N) { // COUT << SS <<」「<< CNT << ENDL。 もし(ANS < J) { ANS = J。 ansstr = SS。 } そう であれば(ANS ==のJ) { ansstr = 分(ansstr、SS)。 } } } } のprintf(" %d個の\ n " 、ANS)。 } }