dtoj2099 字串查詢( find)

2022-08-01 18:36:08 字數 1336 閱讀 9382

給定n個字串和q個詢問

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

1. 字串a是它的字首

2. 字串b是它的字尾

記憶體128m

sol這題我想了個log的做法可是它卡空間!!

可以建兩個ac自動機,然後相當於給你乙個點的對映,每次詢問兩顆子樹內相同的點有幾個。

那麼在乙個樹上線段樹合併,另乙個區間查詢就是nlog的

那麼這一題我們只好先把字串排序,然後二分出a的可行區間,b的可行區間。

離線完a樹狀陣列維護就行。

效率nlog2

#include#include

#include

#include

#include

#include

#include

#define ll unsigned long long

#define p 793999

#define maxn 50005

using

namespace

std;

intn,q;

inttr[maxn],dy[maxn],ans[maxn];

void add(int i,int

v)int ask(int

i)struct

node

void

re()

}s[maxn],s[maxn],a,b;

struct

que;

vector

q[maxn];

bool

operator ==(node a,node b)

intfind(node a,node b)

returnl;}

bool

operator

bool

cmp(node a,node b)

intget(int

l,node t)

returnl;}

int get(int

l,node t)

returnl;}

intmain()

sort(s+1,s+n+1

,cmp);

for(int i=1;i<=n;i++)dy[s[i].id]=i;

for(int i=1;i<=q;i++));

q[r].push_back((que));

}for(int i=1;i<=n;i++)

}for(int i=1;i<=q;i++)printf("

%d\n

",ans[i]);

return0;

}

view code

2 字串查詢

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

13 字串查詢

對於乙個給定的 source 字串和乙個 target 字串,你應該在 source 字串中找出 target 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。說明在面試中我是否需要實現kmp演算法?樣例如果 source source 和 target target 返回 1。如果 sou...

1100 字串查詢

description 給定兩個字串a b,求b在a 現的位置.input 第一行為乙個字串a,長度大於等於1小於等於100000。第二行為乙個字串b,長度大於等於1小於等於1000。output 乙個整數,b在a 現的位置,若b不是a的字串,輸出 1。sample input abababc ab...