• [BZOJ3277]串


    bzoj

    题意

    给出(n)个串,求每个串中有多少个子串在至少(k)个串中出现过。

    sol

    广义后缀自动机。
    先建好广义SAM,也就是把这(n)个串全都插到SAM里面去,那么可以维护每个状态在哪些串里面出现过。
    可以给每个状态维护一个(set),然后向上合并就是直接并起来。
    这里我写基数排序结果鬼掉了,写成建边然后dfs的形式才能过。难道广义后缀自动机不能写基数排序?还求大佬们能教教我。
    然后因为是自下而上取并,所以往上跳时集合大小一定是单调不降的。所以在对每一个串在SAM上跑匹配的时候,要一路跳到(sz[now]ge k)的状态,然后计算答案。

    code

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<set>
    using namespace std;
    const int N = 2e5+5;
    int n,k,last=1,tot=1,tr[N][26],fa[N],len[N],t[N],a[N],size[N];
    string s[N];set<int>S[N];
    void extend(int c,int id)
    {
    	int v=last,u=++tot;last=u;
    	len[u]=len[v]+1;S[u].insert(id);
    	while (v&&!tr[v][c]) tr[v][c]=u,v=fa[v];
    	if (!v) fa[u]=1;
    	else{
    		int x=tr[v][c];
    		if (len[x]==len[v]+1) fa[u]=x;x
    		else{
    			int y=++tot;
    			memcpy(tr[y],tr[x],sizeof(tr[y]));
    			fa[y]=fa[x];fa[x]=fa[u]=y;len[y]=len[v]+1;
    			while (v&&tr[v][c]==x) tr[v][c]=y,v=fa[v];
    		}
    	}
    }
    int to[N],nxt[N],head[N],cnt;
    void link(int u,int v){to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;}
    void dfs(int u)
    {
    	for (int e=head[u];e;e=nxt[e])
    	{
    		dfs(to[e]);
    		for (set<int>::iterator it=S[to[e]].begin();it!=S[to[e]].end();++it)
    			S[u].insert(*it);
    	}
    	size[u]=S[u].size();
    }
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin>>n>>k;
    	for (int i=1;i<=n;++i)
    	{
    		cin>>s[i];last=1;
    		for (int j=0,l=s[i].length();j<l;++j) extend(s[i][j]-'a',i);
    	}
    	for (int i=1;i<=tot;++i) if (fa[i]) link(fa[i],i);
    	dfs(1);
    	if (k>n) {for (int i=1;i<=n;++i) cout<<"0 ";return 0;}
    	for (int i=1;i<=n;++i)
    	{
    		long long ans=0;
    		for (int j=0,l=s[i].length(),now=1;j<l;++j)
    		{
    			now=tr[now][s[i][j]-'a'];
    			while (size[now]<k) now=fa[now];
    			ans+=len[now];
    		}
    		cout<<ans<<' ';
    	}
    	puts("");return 0;
    }
    
  • 相关阅读:
    Git SSH Key 生成步骤
    IOS音频1:之采用四种方式播放音频文件(一)AudioToolbox AVFoundation OpenAL AUDIO QUEUE
    IOS网络篇1之截取本地URL请求(NSURLProtocol)
    IOS 视频直播/智能家居(一行行敲代码,从零开始)lesson:1整体架构
    iOS应用支持IPV6,就那点事儿
    App store最新审核标准公布
    iOS应用内付费(IAP)开发步骤列表
    iOS应用内支付(IAP)的那些坑
    IOS 第三方支付的使用:支付宝
    亲们,委托你们是否已忘记
  • 原文地址:https://www.cnblogs.com/zhoushuyu/p/8660511.html
Copyright © 2020-2023  润新知