题解:CF49E Common ancestor
题目传送门
题目大意
给出两个字符串,给出
思路
注意到
我们分别对两个字符串进行区间
假定我们对两个字符串区间
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=60;
ll n,m,a[N],b[N],fa[N][N][N],fb[N][N][N],dp[N][N],vis[N][N][N],t;
string s1,s2;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>s1>>s2;
n=s1.size();
m=s2.size();
s1=' '+s1;
s2=' '+s2;
for(int i=1;i<=n;i++)a[i]=s1[i]-'a'+1;
for(int i=1;i<=m;i++)b[i]=s2[i]-'a'+1;
cin>>t;
for(int i=1;i<=t;i++){
char c1,c2,z,x,y;
cin>>z>>c1>>c2>>x>>y;
vis[x-'a'+1][y-'a'+1][z-'a'+1]=1;
}
for(int i=1;i<=n;i++)fa[i][i][a[i]]=1;
for(int i=1;i<=m;i++)fb[i][i][b[i]]=1;
for(int len=2;len<=n;len++){
for(int i=1;i+len-1<=n;i++){
int j=i+len-1;
for(int k=i;k<j;k++){
for(int x=1;x<=26;x++){
for(int y=1;y<=26;y++){
for(int z=1;z<=26;z++){
if(fa[i][k][x]&&fa[k+1][j][y]&&vis[x][y][z]){
fa[i][j][z]=1;
}
}
}
}
}
}
}
for(int len=2;len<=m;len++){
for(int i=1;i+len-1<=m;i++){
int j=i+len-1;
for(int k=i;k<j;k++){
for(int x=1;x<=26;x++){
for(int y=1;y<=26;y++){
for(int z=1;z<=26;z++){
if(fb[i][k][x]&&fb[k+1][j][y]&&vis[x][y][z]){
fb[i][j][z]=1;
}
}
}
}
}
}
}
for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)dp[i][j]=1e18;
dp[0][0]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int x=0;x<i;x++){
for(int y=0;y<j;y++){
for(int z=1;z<=26;z++){
if(fa[x+1][i][z]&&fb[y+1][j][z]){
dp[i][j]=min(dp[i][j],dp[x][y]+1);
}
}
}
}
}
}
if(dp[n][m]==1e18)cout<<"-1\n";
else cout<<dp[n][m]<<"\n";
return 0;
}