警示后人
查看原帖
警示后人
965755
u______n楼主2024/1/16 08:27
#include<bits/stdc++.h>
using namespace std;
const int N=2005;
const int inf=1000000000;
int dp[N][N];
int qzh[N][33][2];
char s[N][2];
void work()
{
	int n;
	cin>>n;
	for(int k=0;k<=1;k++)
	for(int i=1;i<=n;i++)
	{
	cin>>s[i][k];
	for(int j=1;j<=26;j++)
	{
	qzh[i][j][k]=qzh[i-1][j][k]+(s[i][k]-'a'+1==j);
	}
	}
	for(int j=1;j<=26;j++)
	if(qzh[n][j][0]!=qzh[n][j][1])
	{
		cout<<-1<<endl;
		for(int i=0;i<=n;i++)
		for(int j=0;j<=n;j++)
		dp[i][j]=0;
		for(int i=1;i<=n;i++)
		s[i][0]=s[i][1]=0;
		for(int i=1;i<=n;i++)
		for(int j=1;j<=26;j++)
		qzh[i][j][1]=qzh[i][j][0]=0;
		return;
	}
	for(int i=0;i<=n;i++)
	for(int j=0;j<=n;j++)
	dp[i][j]=inf;
	for(int i=0;i<=n;i++)
	dp[0][i]=0;
	
	for(int i=1;i<=n;i++)
	for(int j=i;j<=n;j++)
	{
		dp[i][j]=min(dp[i][j],dp[i-1][j]+1);
		if(s[i][0]==s[j][1])
		dp[i][j]=min(dp[i][j],dp[i-1][j-1]);
		//if(qzh[j][s[j][1]-'a'+1][1]>=qzh[i][s[j][1]-'a'+1][0]) //这是错的
		if(qzh[i][s[j][1]-'a'+1][0]<qzh[j][s[j][1]-'a'+1][1]) //这是对的
		dp[i][j]=min(dp[i][j],dp[i][j-1]);
	}
	cout<<dp[n][n]<<endl;
	for(int i=0;i<=n;i++)
	for(int j=0;j<=n;j++)
	dp[i][j]=0;
	for(int i=1;i<=n;i++)
	s[i][0]=s[i][1]=0;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=26;j++)
	qzh[i][j][1]=qzh[i][j][0]=0;
}
signed main(){
	int T;
	cin>>T;
	while(T--)
	work();

	return 0;
}
/*
提供一组易错数据,可以测测自己有没有错
out:

1
5
abcac
cbcaa

ans:

3

*/
2024/1/16 08:27
加载中...