對集合P中的某個元素,假設其長度爲length,找出全部與str[i]~str[i+length-1]徹底重合的元素,比較ans和i+length的大小,ans=max{ans,i+length },求每個合適元素下的ans,取最大值,此即爲dp[i]。對str每個位置i(0~str.length)進行遍歷,直到在集合P中找不到合適的元素。ios
/* ID: jzzlee1 PROG: prefix LANG: C++ */ //#include<iostream> #include<fstream> #include<string> #include<vector> #include<utility> using namespace std; ifstream cin("prefix.in"); ofstream cout("prefix.out"); int ans; string str; vector<pair<string,int> > vec; bool check(int i,int j) { bool flag=1; for(int k=0;k!=vec[j].second;++k) if(str[i+k]!=vec[j].first[k] ) { flag=0; break; } return flag; } int main() { string s; while(cin>>s&&s!=".") vec.push_back(make_pair(s,s.length())); while(cin>>s) str+=s; int i,j; for(i=0;i!=str.length();++i) { for(j=0;j!=vec.size();++j) { if(i+vec[j].second>str.length()) continue; if(check(i,j)) ans=ans>i+vec[j].second?ans:i+vec[j].second; } if(i+1>ans) break; } cout<<ans<<endl; return 0; }