題目
題意乙個字串,由26個小寫英文本母組成, 每個字母都有各自的價值, 要你將乙個字串切成兩個子串, 總價值為兩個串價值和, 若是回文, 則串的價值為每個字母價值和, 否則為0,問最大價值多少。
思路將原串逆序,然後原串與逆序串相互ekmp匹配;對逆串列舉分割點,同時判斷逆串分隔的兩部分是否回文(根據extend陣列判斷),價值相加,迴圈取最大值
**
#include
#include
#include
#include
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#define x first
#define y second
#define best 131
#define inf 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define pii pair
#define lowbit(x) x & -x
using
namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
double eps=
1e-7
;const
double pai=
acos(-
1.0)
;const
int n=
2e4+10;
const
int maxn=
1e6+10;
const
int mod=
1e9+7;
int t,n,m,k,cnt,tot;
int next1[maxn]
,next2[maxn]
,ext1[maxn]
,ext2[maxn]
,v[maxn]
,sum[maxn]
;//擴充套件kmp是用來求主串每個點可以向後延伸與模式串匹配的最長的長度
void
getnext
(string &s,
int next)
//模式串 }}
void
exkmp
(string &s,string &t,
int next,
int ext)
// t是主串,s是模式串 }}
intmain()
exkmp
(s1,s2,next1,ext1)
;//s1是模式串 s2是主串
exkmp
(s2,s1,next2,ext2)
;//s2是模式串 s1是主串
int ans=0;
for(
int i=
1;i) cout<
}return0;
}
Best Reward 擴充套件kmp
題目 題意乙個字串,由26個小寫英文本母組成,每個字母都有各自的價值,要你將乙個字串切成兩個子串,總價值為兩個串價值和,若是回文,則串的價值為每個字母價值和,否則為0,問最大價值多少。思路將原串逆序,然後原串與逆序串相互ekmp匹配 對逆串列舉分割點,同時判斷逆串分隔的兩部分是否回文 根據exten...
擴充套件kmp的應用 Best Reward
best reward 題意 給定乙個長度為n的字串,問你能否將這個字串分成兩個字串,如果分成的字串是回文子串,那麼就會有價值,求分成兩個串的最大價值。題解 學習到一手擴充套件kmp預處理後,o 1 就能判斷分成的兩個串是否為回文子串。s1為原串,s2為s1翻轉之後的串,然後你對s2求s1的ex陣列...
KMP 擴充套件KMP
本文將不斷加入例題,稍安勿躁,今天的總結爭取9 30寫完.kmp,中文名字叫字串匹配,用於解決一類字串匹配問題.先下一些定義 首先我們先想一想 nxt i 對於求解問題有怎樣的幫助.我們對於每乙個 t i s 1 的位置都匹配一次,這樣子複雜度為 theta n m 的.考慮在暴力匹配中其實我們不一...