poj3192

把所有串全排列,每次排列按顺序从左到右将各串叠加起来,叠加过程遵循最短原则。

search(f, f+n, g, g+m);在f中查找g,返回第一个与g完全匹配的起始位置,若无法匹配则返回f+m。

copy(f,f+n,g);将f中的n个元素拷贝到g中。

View Code
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define maxn 10
#define maxl 10

int n;
char word[maxn][maxl];
int f[maxn];
char ans[maxn * maxl];

void input()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        scanf("%s", word[i]);
}

void add(char *a, char *b)
{
    int len_a = strlen(a);
    int len_b = strlen(b);
    if (search(a, a + len_a, b, b + len_b) != a + len_a)
        return;
    for (int i = max(0, len_a - len_b); i <= len_a; i++)
    {
        bool ok = true;
        for (int j = 0; j < len_a - i; j++)
            if (a[i + j] != b[j])
            {
                ok = false;
                break;
            }
        if (ok)
        {
            copy(b, b + len_b + 1, a + i);
            return;
        }
    }
}

int main()
{
    //freopen("t.txt", "r", stdin);
    input();
    for (int i = 0; i < n; i++)
        f[i] = i;
    int len = maxn * maxl;
    do
    {
        ans[0] = 0;
        for (int i = 0; i < n ;i++)
            add(ans, word[f[i]]);
        len = min(len, (int)strlen(ans));
    }while (next_permutation(f, f + n));
    printf("%d\n", len);
    return 0;
}
原文地址:https://www.cnblogs.com/rainydays/p/2753572.html