网站空间哪里买,东莞人才招聘网最新招聘信息,网站模板 站长之家,大城 网站建设正题
luogu CF1363F 题目大意
给你一个字符串#xff0c;你以旋转其中一个字串#xff08;将最后一给点移到前面#xff0c;然后整体向后移一位#xff09;#xff0c;问最少要多少布可以到目标字符串 解题思路
设 fi,jf_{i,j}fi,j 为 sss 中的前 iii 个字符构成 ttt…正题
luogu CF1363F 题目大意
给你一个字符串你以旋转其中一个字串将最后一给点移到前面然后整体向后移一位问最少要多少布可以到目标字符串 解题思路
设 fi,jf_{i,j}fi,j 为 sss 中的前 iii 个字符构成 ttt 中的前 jjj 个字符的最小步数不足的后面旋转过来补
那么对于 sss 中的一个字符可以直接和当前点匹配也可以往前移去补位置不能直接往后移
时间复杂度 O(n2)O(n^2)O(n2) code
#includecstdio
#includecstring
#includeiostream
#includealgorithm
#define ll long long
#define N 2022
using namespace std;
int T,n,pp,a[N][26],b[N][26],f[N][N];
char s[N],t[N];
const int inf1000000000;
int main()
{scanf(%d,T);while(T--){scanf(%d%s%s,n,s1,t1);memset(a[0],0,sizeof(a[0]));memset(b[0],0,sizeof(b[0]));for(int i1;in;i){memcpy(a[i],a[i-1],sizeof(a[i]));memcpy(b[i],b[i-1],sizeof(b[i]));a[i][s[i]-a];b[i][t[i]-a];}pp1;for(int i0;i26;i)if(a[n][i]!b[n][i]){pp0;break;}if(!pp){puts(-1);continue;}for(int i0;in;i)for(int j0;jn;j)f[i][j]inf;f[0][0]0;for(int i0;in;i)for(int jmax(i,1);jn;j){f[i][j]min(f[i][j],f[i][j-1]1);if(is[i]t[j])f[i][j]min(f[i][j],f[i-1][j-1]);if(ia[i][s[i]-a]b[j][s[i]-a])f[i][j]min(f[i][j],f[i-1][j]);}printf(%d\n,f[n][n]);}return 0;
}