标签:strlen freopen include 最大 code 变换 pac open 序列
一开始的思路就是暴力匹配,数据只有 \(2000\) 最大嘛,先是把s串作为文本串,u作为模式串取匹配,过了样例交一发,看着测评机跑到了25,突然就停了,果真没这么简单,wa了一发,然后想一下,如果两个互换位置再匹配一次行不行,没想到还真过了。
乱搞过了,还是把道理给搞清楚吧。
首先我们应该保证不会删除两端的字母,这一步对我们的变换是没有任何贡献的,所以,我们只剩下两种操作,在两头添加字母,或者改变序列的字母。
简单的模拟几个样例后我们发现。
对于把s作为文本串,选取一个匹配度最大的段,接下来我们的操作是改变序列的字母,或者在后端添加字。
对于把u作为文本串,我们的操作就是选取一个匹配度最大的位置,然后在两头添加字母或者改变序列的子字母。
其实这两个做的都是同一个工作,就是在s中找到一个串,其在u中的匹配度是最大的,对于我们的第一次操作,得到的是s的后半段中与u匹配度最大的部分,第二次操作得到的是s的整个段或者是前段中与u匹配读最大的。
这两次匹配没想到竟然把所有的情况都考虑完了,而我却碰巧A了这题。
#include<bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10;
char a[N], b[N];
int main() {
// freopen("in.txt", "r", stdin);
scanf("%s %s", a + 1, b + 1);
int la = strlen(a + 1), lb = strlen(b + 1), maxn = 0;
for(int i = 1; i <= la; i++) {//a作为文本串
int now = (a[i] == b[1]);
for(int j = 1; j + 1 <= lb && i + j <= la; j++)
now += (a[i + j] == b[j + 1]);
if(now > maxn) maxn = now;
}
for(int i = 1; i <= lb; i++) {//b作文文本串
int now = (b[i] == a[1]);
for(int j = 1; j + 1 <= la && i + j <= lb; j++)
now += (b[i + j] == a[j + 1]);
if(now > maxn) maxn = now;
}
printf("%d\n", lb - maxn);//暴力匹配两次还真能过。
return 0;
}
标签:strlen freopen include 最大 code 变换 pac open 序列
原文地址:https://www.cnblogs.com/lifehappiness/p/12826550.html