对集合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中找不到合适的元素。
/*ID: jzzlee1PROG: prefixLANG: C++*///#include#include #include #include #include using namespace std;ifstream cin("prefix.in");ofstream cout("prefix.out");int ans;string str;vector > 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< <