hihocoder 1264 神奇字串 (列舉+模擬)

_TCgogogo_發表於2016-03-14
時間限制:20000ms
單點時限:1000ms
記憶體限制:256MB

描述

我們說兩個字串是非常相似的,當且僅當它們的編輯距離小於等於1.

現在我們有兩個字串A和B, 每個單位時間你可以交換字串A的相鄰的兩個字元.

問最少需要多少時間,你可以讓A和B變得非常相似?保證存在一種這樣的方案.

輸入

第一行一個字串,表示A.

第二行一個字串,表示B.

所有字串都僅有英文小寫字母組成.

A和B的長度都不超過100.

輸出

一行表示最少需要的時間.

樣例輸入
nwlrb
rclwnb
樣例輸出
6

題目連結:http://hihocoder.com/problemset/problem/1264

題目分析:編輯距離就是增刪該的次數資料範圍很小,對B列舉進行增刪改的操作得到C,然後在A中找C對應位置的字元,然後交換記錄次數

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const INF = 0x3fffffff;
char a[105], b[105], c[105], aa[105];
int lena, lenb;

int cal()
{
    memcpy(a, aa, sizeof(aa));
    int res = 0;
    int len = strlen(c);
    if(len != lena)
        return INF;
    int i = 0, j = 0;
    while(j != len)
    {
        int edi = -1;
        for(int ii = i; ii < lena; ii++)
        {
            if(a[ii] == c[j])
            {
                edi = ii;
                break;
            }
        }
        if(edi == -1)
            return INF;
        for(int k = edi; k > i; k--)
        {
            swap(a[k], a[k - 1]);
            res ++;
        }
        i ++;
        j ++;
    }
    return res;
}

int main()
{
    int ans = 100000;
    scanf("%s %s", a, b);
    memcpy(aa, a, sizeof(a));
    lena = strlen(a);
    lenb = strlen(b);
    if(strcmp(a, b) == 0)
        printf("0\n");
    else
    {
        //增
        for(int i = 0; i <= lenb; i++)
        {
            for(char j = 'a'; j <= 'z'; j++)
            {
                memcpy(c, b, sizeof(b));
                for(int k = lenb; k > i; k--)
                    c[k] = c[k - 1];
                c[i] = j;
                ans = min(ans, cal());
            }
        }
        //改
        memcpy(c, b, sizeof(b));
        for(int i = 0; i < lenb; i++)
        {
            for(char j = 'a'; j <= 'z'; j++)
            {
                char tmp = c[i];
                c[i] = j;
                ans = min(ans, cal());
                c[i] = tmp;
            }
        }
        //刪
        for(int i = 0; i < lenb; i++)
        {
            memcpy(c, b, sizeof(b));
            for(int k = i; k < lenb - 1; k++)
                c[k] = c[k + 1];
            c[lenb - 1] = '\0';
            ans = min(ans, cal());
        }
        printf("%d\n", ans);
    }
}


相關文章