Bzoj4641 基因改造

2021-08-17 16:38:07 字數 1467 閱讀 9970

給定字串s和t,可以交換任意字元,求s的哪些連續子串與t匹配

題目可以轉化為

字串匹配,匹配規則是模式串與文字串的子串不一樣的情況相同(e

.g31

3=21

2=13

1)( e.

g313

=212

=131

)既然是檢視不一樣的情況那麼就記錄一下相同元素上一次出現的位置(老套路?)

然後令a[i

]/b[

i]=i

a [i

]/b[

i]=i

-上一次的位置,就可以直接km

p kmp

了注意幾種特殊的合法情況1:

1

:當前字元

s s

是第一次出現 2:

' role="presentation" style="position: relative;">2:2

:當前字元位置

− −

上一次出現的位置大於等於當前匹配長度

#include

#include

#define fp(i,a,b) for(int i=a,i=b;i<=i;++i)

#define fd(i,a,b) for(int i=a,i=b;i>=i;--i)

#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

template

inline

bool chkmax(t&a,const t&b)

template

inline

bool chkmin(t&a,const t&b)

using

namespace

std;

char ss[1

<<17],*a=ss,*b=ss;

inline

char gc()

template

inline

void sd(t&x)

char sr[1

<<21],z[20];int c=-1,z;

template

inline

void we(t x)

const

int n=1e6+5;

typedef

int arr[n];

int cas,n,m;arr a,b,fa,pos,nx;

inline

bool ok(int x,int y)

inline

void solve()

for(int i=1,j=0;i<=n;++i)

we(pos[0]);sr[c]='\n';

fp(i,1,pos[0])we(pos[i]);sr[++c]='\n';

}int main()

bzoj4641 基因改造 KMP hash

依稀記得,noip 之前的我是如此的弱小.完全不會 kmp 的寫法,只會暴力 hash 大體思路為把乙個串的雜湊值拆成 26 個字母的位權 即 hash s sum limits a sum w i s i a 通過記錄每個字母第一次出現的位置,用 26 的時間來確定 f 是什麼 然後通過確定的 f...

特殊位置kmp匹配 bzoj4641 基因改造

傳送門!將每個數變成當前位置減上一次出現的位置,用kmp kmpkm p匹配,但要注意如果當前位置減上一次出現位置的差超過了匹配長度則視為沒有出現過,要特判 include include include include include define maxn 1000005 define ll l...

BZOJ 2764 JLOI2011 基因補全

題目 題意 給定乙個長度為n的鹼基序列s和乙個長度為m的鹼基序列t,現在希望向序列t裡補一定的鹼基使得序列s和序列t配對,配對的規則是a與t配對,c與g配對,新增鹼基的位置與數量不同的方案視為不同,求不同的方案數。0n 2000 題解 可以考慮算出序列t在序列s裡匹配的本質不同方案數,利用dp可以很...