SCOI2012 喵星球上的點名

2021-09-12 04:17:52 字數 949 閱讀 8827

對於第乙個詢問,對於姓名串建廣義字尾自動機,那麼我們對於插入乙隻喵的姓名串,要將這兩個(姓和名)串的所有字串位置打標記,怎麼搞呢,其實可以直接插入暴力向上跳,複雜度的話:對於乙個串假設長度為x,那麼插入複雜度是min(x*x,x*n),而最多只有n/x個這樣的串,算一下總的複雜度上界是n根號的。然後就是第二個詢問,剛開始*****了,以為再對詢問串建廣義字尾自動機暴力跑姓名串,之後發現如果失配要保留最大字首沒法搞只能用ac自動機。去看了一下廣義sam的題解,發現直接把詢問串也建在姓名串的廣義sam裡就是對的了,因為這樣的話暴力跑姓名串就不會出現失配的情況了。。

**:

#includeusing namespace std;

const int n=2e5+100;

int n,m;

vectorfi[n],sc[n],q[n];

struct sam

void ins(int x)

return;

}np=++tot,mx[np]=mx[p]+1,las=np;

for(;p&&!nxt[p][x];p=fa[p])nxt[p][x]=np;

if(!p)

t=nxt[p][x];

if(mx[t]==mx[p]+1)fa[np]=t;

else

}void upd1(int x,int y)

void upd2(int x,int y)

void in1()

}void in2()

}void sol1()

nw=nxt[nw][q[i][j]];

}if(!can)puts("0");

else printf("%d\n",sz[nw]),szz[nw]++;}}

void sol2()

puts("");

}}sam;

int main()

SCOI2012 喵星球上的點名

有n個串,代表n個人的姓氏和名字,都是用很多個數字表示的,比如我姓1,2,3,4,名4,5,6,7。然後有m個點名串,如果點到了某個人的姓或名裡面的某一串,那個人就被點到,不過乙個人在乙個點名串中只能被點一次。比如點名串是2,3,4,我的姓中含有2,3,4,那麼我就會被叫到。求每個學生分別被叫到多少...

SCOI2012 喵星球上的點名

給出n個模式串,m個文字串,每個模式串由兩部分組成,我們認為乙個模式串被乙個文字串包含只要這個文字串包含它的兩部分中的其中一部分的子串。求每個文字串包含多少個模式串,每個模式串又被多少個文字串包含。1 n 20000,1 m 50000,模式串總長和文字串的總長分別不超過100000 保證模式串和文...

SCOI2012 喵星球上的點名

點此看題 0x01 ac自動機 如果字符集沒有這麼大的話,就是ac text ac自動機的板題。我們可以開map mapma p存轉移,然後就完了。寫了之後對map mapma p的理解會有所提公升吧,雖然是過不了luo gu luogu luog u的加強版,還是貼個 include includ...