HNOI2006 最短母串 狀壓DP

2021-08-28 12:16:25 字數 3233 閱讀 1175

description

給定n個字串(s1,s2,„,sn),要求找到乙個最短的字串t,使得這n個字串(s1,s2,„,sn)都是t的子串。

sample input

2abcd

bcdabc

sample output

abcdabc

考慮狀壓dp。

先去一下重。

然後預處理兩個串的最大重疊。

然後就是字典序的大小,於是你每次都要back回去。。。

有點麻煩。

strcmp返回大於0的值表示大於。。。

#include

#include

#include

using

namespace std;

typedef

long

long ll;

int_min

(int x,

int y)

int_max

(int x,

int y)

intread()

while

(ch >=

'0'&& ch <=

'9') s = s *

10+ ch -

'0', ch =

getchar()

;return s * f;

}int f[13]

[4096

], last[13]

[4096];

int bs[13]

[13], len[13]

;char ss[13]

[51], qq[31]

[51], hh[

610]

, ll[

610]

;bool

check

(int a,

int b,

int c,

int d)

for(

int i =

1; i <= tp1 /

2; i++

)swap

(hh[i]

, hh[tp1 - i +1]

);hh[tp1 +1]

='\0'

;int tp2 =0;

for(

int i = len[a]

; i; i--

) ll[

++tp2]

= qq[a]

[i];

for(

int i = len[c]

- bs[c]

[a]; i; i--

) ll[

++tp2]

= qq[c]

[i];

pos = c, now = d;

while

(pos)

for(

int i =

1; i <= tp2 /

2; i++

)swap

(ll[i]

, ll[tp2 - i +1]

);ll[tp2 +1]

='\0';if

(strcmp

(hh +

1, ll +1)

>0)

return1;

return0;

}int

main()

}if(!hh)}if

(bk)

break;}

if(!bk)

} n = tp;

if(n ==0)

for(

int i =

1; i <= n; i++

)} uu--;if

(k + uu -

1== len[i]

) bs[i]

[j]=

_max

(bs[i]

[j], uu);}

}}memset

(f,-1,

sizeof

(f))

;for

(int i =

1; i <= n; i++

) f[i][1

<< i -1]

= len[i]

;for

(int i =

1; i <

2046

; i++

)else

if(f[k]

[i ^(1

<< k -1)

]== f[j]

[i]+ len[k]

- bs[j]

[k])}}

}for

(int i =

2046

; i <(1

<< n)

; i++

)else

if(f[k]

[i ^(1

<< k -1)

]== f[j]

[i]+ len[k]

- bs[j]

[k])}}

}int ans =

999999999

;for

(int i =

1; i <= n; i++

)memset

(hh,0,

sizeof

(hh)),

memset

(ll,0,

sizeof

(ll));

int g;

for(

int i =

1; i <= n; i++)if

(f[i][(

1<< n)-1

]== ans)

ll[ans +1]

='\0'

, hh[ans +1]

='\0'

;for

(int j =

1; j <= ans /

2; j++

)swap

(ll[j]

, ll[ans - j +1]

);if(hh[1]

==0)elseif(

strcmp

(hh +

1, ll +1)

>0)

swap

(hh, ll)

, g = i;

}int o =

strlen

(hh +1)

;printf

("%s\n"

, hh +1)

;return0;

}

習題 最短母串(狀壓)

題目 記憶體限制 512 mib時間限制 1000 ms標準輸入輸出 題目型別 傳統評測方式 文字比較 題目描述 給定n 個字串 要求找到乙個最短的字串 使得這 n個字串都是它 的子串。輸入格式 第一行是乙個正整數 表示給定的字串的個數 以下的 n 1 行,每行有乙個全由大寫字母組成的字串。輸出格式...

BZOJ 1195 HNOI2006 最短母串

一看字串就想到ac自動機是不是沒救了 然後決定在ac自動機上做分層圖最短路233333333 結果發現極限資料剛好卡時限了qaq 仔細一想好像每條邊的長度都是1哎。果斷bfs 其實dfs應該也可以的吧,而且可以剪枝。但是我有dfs恐懼症,於是果斷選擇了bfs。結果跑得奇慢無比。不談了我想靜靜 inc...

bzoj1195 HNOI2006 最短母串

此題似乎是乙個dp。dp i j 表示選了i這個集合的字串,最後乙個是j的最短字串。字典序順便搞定 然後發現需要處理掉一串為另一串子串的情況,特判一些特殊情況 或者奇怪的姿勢 就好了。這題很卡空間,請務必不要亂開陣列。include define gc getchar using namespace...