Message

Posted lifehappiness

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Message相关的知识,希望对你有一定的参考价值。

Message

思路

一开始的思路就是暴力匹配,数据只有 (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
", lb - maxn);//暴力匹配两次还真能过。
    return 0;
}

以上是关于Message的主要内容,如果未能解决你的问题,请参考以下文章

为什么变量没有未定义?

从广播接收器更改片段

spring 国际化 js怎么设置

在mail_admins()中发送EmailMultiAlternatives

elementUI的Message Box弹窗中添加图片并显示

如何获得warnings.warn发出警告而不忽略该行?