栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 3633 Copying DNA

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 3633 Copying DNA

#include <cstdio>#include <cstring>#include <algorithm>#define min(x,y) ((x)<(y)?(x):(y))#define max(x,y) ((x)>(y)?(x):(y))using namespace std;const int L = 19, N = 1 << (L - 1);const char EPT = 'O';char _s[L], _rs[L];   char _t[L], _rt[L];    bool _flg[128];         int _dis[N];int _pre[L][L][L];     int _send, _tend;      int KMP(char p[], char t[], int pre[]) {    int res = 0;    for (int i = 0, j = -1; 0 != t[i]; ++i) {        for (; -1 < j && p[j + 1] != t[i]; j = pre[j]);        if (p[j + 1] == t[i]) ++j;        if (res < j + 1) res = j + 1;        if (0 == p[res]) break;    }    return res;}void Depre(int inx, char s[], char rs[]) {    for (int i = 0, j = 1; i < _tend; ++i, j <<= 1) {        // if (inx & i) rs[i] = _t[i];        if (inx & j) s[i] = _t[i];        else s[i] = EPT;    }    rs[_tend] = 0;    reverse_copy(s, s + _tend, rs);    s[_tend] = 0;}int DFS(int d, int inx) {    if (-1 != _dis[inx]) return _dis[inx];    char t[L], rt[L];    Depre(inx, t, rt);    int prelen = 0;    int bst = _tend;    for (int i = 0, j; 0 != t[i]; ++i) {        for (j = i; EPT == t[j]; ++j);        if (j == i) { prelen = 0; continue;        }        char ch = _t[j];        _t[j] = 0;        int *pre = _pre[i][j];        int len = KMP(_t + i, _s, pre);        len = max(len, KMP(_t + i, _rs, pre));        len = max(len, KMP(_t + i, t, pre));        len = max(len, KMP(_t + i, rt, pre));        _t[j] = ch;        if (prelen <= len) { int nxt = inx | (((1 << (i + len)) - 1) ^ ((1 << i) - 1)); int ret = DFS(d + 1, nxt); bst = min(bst, ret + 1);        }        prelen = max(prelen - 1, len);    }    return _dis[inx] = bst;}void CalPre(char p[], int pre[]) {    pre[0] = -1;    for (int i = 1, j = -1; 0 != p[i]; ++i) {        for (; -1 < j && p[j + 1] != p[i]; j = pre[j]);        if (p[j + 1] == p[i]) ++j;        pre[i] = j;    }}void InitPre() {    for (int i = 0; 0 != _t[i]; ++i) {        for (int j = i + 1; 0 != _t[j - 1]; ++j) { char ch = _t[j]; _t[j] = 0; CalPre(_t + i, _pre[i][j]); _t[j] = ch;        }    }}void Init() {    _send = strlen(_s);    _tend = strlen(_t);    reverse_copy(_s, _s + _send, _rs);    _rs[_send] = 0;    reverse_copy(_t, _t + _tend, _rt);    _rt[_tend] = 0;    memset(_dis, -1, sizeof(_dis));    _dis[(1 << _tend) - 1] = 0;    InitPre();}int main() {    int tc, i;    scanf("%dn", &tc);    while (tc--) {        _flg['A'] = _flg['C'] = _flg['G'] = _flg['T'] = false;        gets(_s);        gets(_t);        for (i = 0; 0 != _s[i]; ++i) { _flg[_s[i]] = true;        }        for (i = 0; 0 != _t[i]; ++i) { if (!_flg[_t[i]]) break;        }        if (0 != _t[i]) { puts("impossible"); continue;        }        Init();        printf("%dn", DFS(0, 0));    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/378627.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号