hdu 4681 String

来源:互联网 发布:gta5帧数怎么优化 编辑:程序博客网 时间:2024/06/07 11:21

题目:hdu 4681 String

思路:预处理求正向逆向的最长公共子序列,枚举C串在A,B中出现的两头位置的最长公共子序列+C的长度


#include <cstring>#include <string>#include <algorithm>#include <cmath>#include <iostream>#include <cstdio>#include <vector>using namespace std;vector<pair<int,int> >va,vb;#define maxn 1010int dpr[maxn][maxn];int dpl[maxn][maxn];string a,b,c;void init(){memset(dpr,0,sizeof(dpr));memset(dpl,0,sizeof(dpl));for(int i=1;i<=a.size();i++)for(int j=1;j<=b.size();j++){if(a[i-1]==b[j-1])dpl[i][j]=dpl[i-1][j-1]+1;elsedpl[i][j]=max(dpl[i-1][j],dpl[i][j-1]);}for(int i=a.size();i>=1;i--)for(int j=b.size();j>=1;j--){if(a[i-1]==b[j-1])dpr[i][j]=dpr[i+1][j+1]+1;elsedpr[i][j]=max(dpr[i][j+1],dpr[i+1][j]);}}int main(){int t;int cas=0;scanf("%d",&t);while(t--){cin>>a>>b>>c;init();va.clear();vb.clear();int index;for(int i=0;i+c.size()<=a.size();i++){if(a[i]==c[0]){index=1;int tmp=i+1;while(index!=c.size() && tmp<a.size() ){if(a[tmp]==c[index]){index++;tmp++;}elsetmp++;}if(index==c.size())va.push_back(make_pair(i,tmp-1));}}for(int i=0;i+c.size()<=b.size();i++){if(b[i]==c[0]){index=1;int tmp=i+1;while(index!=c.size() && tmp<b.size() ){if(b[tmp]==c[index]){index++;tmp++;}elsetmp++;}if(index==c.size())vb.push_back(make_pair(i,tmp-1));}}int ans=0;int cnt;vector<pair<int,int> >::iterator aa=va.begin(),bb=vb.begin();for(aa=va.begin();aa!=va.end();aa++)for(bb=vb.begin();bb!=vb.end();bb++){cnt=c.size()+dpl[aa->first][bb->first]+dpr[aa->second+2][bb->second+2];ans=max(ans,cnt);}printf("Case #%d: %d\n",++cas,ans);}return 0;}


原创粉丝点击