JZOJ 3887 字串查詢

2021-07-26 06:55:06 字數 1588 閱讀 7262

給定n個字串和q個詢問

每次詢問在這n個字串中,有多少個字串同時滿足

1. 字串a是它的字首

2. 字串b是它的字尾

100%資料滿足n,q≤50000,字串長度不超過100,任意兩串最長公共字首和最長公共字尾較短(interesting)

我比賽的思路是將字串按字首字典序排序,然後二分出一段區間

那麼我們需要統計的就是這段區間內的字串有多少個b是它的字尾

考場想的雜湊+vector上二分來算,gg了

其實可以也按字尾排序,也二分出一段區間

於是詢問就是形如第一維座標在[x1,y1]內,第二維座標在[x2,y2]內的點數

這是經典套路題,可以將詢問拆成4個,容斥搞搞

那麼對於單個詢問,可以按第一維為關鍵字排序,第二維維護乙個樹狀陣列

至於字串的排序,因為題目特定條件,可以快拍,當然桶排也行

#include

#include

#include

#include

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

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

using

namespace

std;

const

int n=50002,l=102;

int n,m,num,l1,l2,ra[n],rb[n],d[n],c[n],bit[n],ans[n*4];

char s1[l],s2[l];

struct lyd

a[n],b[n];

struct node

f[n*4];

bool cmppx(lyd a,lyd b)

int findl(int l,int r,int bz)

else

if(k>0) r=mid;

else l=mid+1;

}return l;

}int findr(int l,int r,int bz)

else

if(k==0 || k==2) l=mid+1;

else r=mid;

}return l;

}int lowbit(int x)

void add(int x)

int get(int x)

int main()

sort(a+1,a+n+1,cmppx);

fo(i,1,n) ra[a[i].id]=i;

sort(b+1,b+n+1,cmppx);

fo(i,1,n) rb[b[i].id]=i;

fo(i,1,n) d[ra[i]]=rb[i];

a[n+1].s[a[n+1].l=1]='z',b[n+1].s[a[n+1].l=1]='z';

fo(k,1,m)

sort(f+1,f+num+1,cmpc);

int j=1;

fo(i,1,num)

fo(i,1,m)

return

0;}

Jzoj2934 字串函式

兩個等長的由大寫英文本母構成的字串a和b,從a中選擇連續子串x,從b中選出連續子串y。定義函式f x,y 為滿足條件xi yi 1 i x 的i的個數,計算f x,y 的數學期望。x y 首先顯然不能每個串暴力,我們考慮單獨計算每乙個字元的貢獻 對於b i 若我們找到a j b i 可以分兩種情況討...

Jzoj2934 字串函式

兩個等長的由大寫英文本母構成的字串a和b,從a中選擇連續子串x,從b中選出連續子串y。定義函式f x,y 為滿足條件xi yi 1 i x 的i的個數,計算f x,y 的數學期望。x y 首先顯然不能每個串暴力,我們考慮單獨計算每乙個字元的貢獻 對於b i 若我們找到a j b i 可以分兩種情況討...

2 字串查詢

kmp演算法 kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是實現乙個next 函式,函式本身包含了模式串的區域性匹配資訊。時間複雜度o m n 通過getnext 實現部分匹配值,然後利用kmp演算法計算是否匹配。如下 package li...