zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    【转载】Scarbee Pre-Bass 贝司的使用教程
    罗兰管弦乐音色表【中英文对照】 ----转载
    快速查询
    免费好用的Noto字体
    用了一年多之后才搞懂阿里云OSS收费细则
    “生成能够被扫描枪正常扫描出中文的二维码”
    .NET Core 3.0正式版发布
    快速删除一个“大目录”
    WSL2(预览版)体验笔记
    局域网地址为什么是192.168.X.X?为什么连上公司的VPN就上不了网?
  • 原文地址:https://www.cnblogs.com/lifehappiness/p/12826550.html
Copyright © 2011-2022 走看看