码迷,mamicode.com
首页 > 其他好文 > 详细

Message

时间:2020-05-04 15:12:38      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:strlen   freopen   include   最大   code   变换   pac   open   序列   

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\n", lb - maxn);//暴力匹配两次还真能过。
    return 0;
}

Message

标签:strlen   freopen   include   最大   code   变换   pac   open   序列   

原文地址:https://www.cnblogs.com/lifehappiness/p/12826550.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!