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;

}

你可能感兴趣的:(poj)