23ABCDBCDFFBRCD2roseorchid
22
题目简意:寻找给定若干字符串中的最长公共子序列 其中该序列可正序可反序
// HDOJ_1238.cpp : Substrings //求子串:s.substr(position,len); //查找字串:s.find(s1);如果没找到,则返回-1,可用s.find(s1)!=-1来判断是否找到子串 //求字符串长度:s.length() //翻转字符串:reverse(s.begin(),s.end())会把s自己本身翻转过来 #include "StdAfx.h" #include <fstream> #include <iostream> #include <string> #include <cstring> #include <algorithm> //reverse函数在algorithm中 不过VS有了"StdAfx.h"就不需要它了 //sort也在algorithm中 但只有"StdAfx.h"又不行 奇怪 using namespace std; int main() { ifstream cin("1238_input.txt"); //调试用 int t, n, i, j, k; //t=test cases cin >> t; while ( t-- ){ cin >> n; string *a = new string[n]; string *b = new string[n]; int minLength = 150; int minIndex; for( i=0; i<n; i++ ){ cin >> a[i]; b[i] = a[i]; reverse(b[i].begin(),b[i].end()); //reverse为void类型 if( minLength > a[i].length() ){ minLength = a[i].length(); minIndex = i; } } //cout << minLength << endl; string subString; bool fail; int maxLength=0; for( i=0; i<minLength; i++ ) for( j=1; j<=minLength-i; j++ ){ fail = 0; subString = a[minIndex].substr(i,j); //cout << subString << endl; for( k=0; k<n; k++ ){ if(a[k].find(subString)!=-1 && k==n-1 ){ maxLength = max(maxLength, j); //cout << maxLength << endl; } if(a[k].find(subString)==-1){ //返回-1表未找到 if(b[k].find(subString)==-1 ){ fail = 1; break; //从k循环跳出 } else if( k==n-1 ) maxLength = max(maxLength, j); } } if( fail == 1 ) break; } delete []a; delete []b; cout << maxLength << endl; }//while return 0; }