給定字串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可以很...