传送门
调代码调的我怀疑人生。
启发式合并用迭代写怎么都跑不过(雾
换成了 d f s dfs dfs版本的终于过了233.
题意简述:求给出 n n n个字串,对于每个给定的字串求出其有多少个字串在至少 k k k个剩下字串中出现过。
显然先对所有字串建一个 s a m sam sam出来,然后对于每个状态用一个 s e t set set维护在哪些字串里面出现过(这个显然需要在建完 p a r e n t parent parent树之后启发式合并一波),最后拿每个串在上面匹配,如果当前的状态不满足题意就沿着树边向上跳即可。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int M=2e5+5;
int k,T;
string s[M];
typedef long long ll;
struct SAM{
int last,tot,len[M],son[M][26],link[M],cnt[M],rk[M],val[M];
set<int>S[M