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...