SCOI2012 喵星球上的點名

2021-07-09 14:53:35 字數 1110 閱讀 2575

給出n個模式串,m個文字串,每個模式串由兩部分組成,我們認為乙個模式串被乙個文字串包含只要這個文字串包含它的兩部分中的其中一部分的子串。求每個文字串包含多少個模式串,每個模式串又被多少個文字串包含。

1≤n≤20000,1≤m≤50000,模式串總長和文字串的總長分別不超過100000 保證模式串和文字串中作為字元存在的數不超過10000。

標準的字串匹配神題。

可以用ac自動機水過。

字符集很大,c++開map即可。

發現文字串只有一部分,就把它建樹,對於匹配的某個節點延失配指標暴力統計答案即可。

正解似乎是sa+chairman_tree,但由於有總長限制似乎不好卡掉。

又有誰會那麼無聊來到處亂hack呢~~

#include

#include

#include

#include

#include

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

#define n 20005

#define m 50005

#define len 100005

using

namespace

std;

typedef

vector

vec;

typedef

map:: iterator it;

map trie[len];

vec a[n],b[n],p[len];

int d[len],next[len],ans1[m],ans2[n],h[m],x,tot,n,m,len,bz;

void makefail() d[++j]=x;

}

}}int find(vec a)

}return z;

}int main()

fo(i,1,m) p[y].push_back(i);

}makefail();

fo(i,1,n)

fo(i,1,m) printf("%d\n",ans1[i]);

fo(i,1,n) printf("%d ",ans2[i]);

}

SCOI2012 喵星球上的點名

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

SCOI2012 喵星球上的點名

對於第乙個詢問,對於姓名串建廣義字尾自動機,那麼我們對於插入乙隻喵的姓名串,要將這兩個 姓和名 串的所有字串位置打標記,怎麼搞呢,其實可以直接插入暴力向上跳,複雜度的話 對於乙個串假設長度為x,那麼插入複雜度是min x x,x n 而最多只有n x個這樣的串,算一下總的複雜度上界是n根號的。然後就...

SCOI2012 喵星球上的點名

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