• P4081 [USACO17DEC]Standing Out from the Herd


    题目

    P4081 [USACO17DEC]Standing Out from the Herd

    做法

    一眼合并(endpos)裸题

    其实是不需要合并的,因为保证只在一个串出现,建个(parent)树统计一下就好了

    My complete code

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<string>
    #include<algorithm>
    using namespace std;
    typedef int LL;
    const LL maxn=200009;
    LL n,m,nod=1,lst;
    LL len[maxn],fail[maxn],son[maxn][26],visit[maxn],ans[maxn],mark[maxn];
    string s;
    inline void Insert(LL c,LL id){
    	LL np=++nod,p=lst; lst=np; mark[np]=id;
    	len[np]=len[p]+1;
    	while(p&&!son[p][c]){
    		son[p][c]=np;
    		p=fail[p];
    	}
    	if(!p)
    	    fail[np]=1;
    	else{
    		LL q=son[p][c];
    		if(len[q]==len[p]+1)
    		    fail[np]=q;
    		else{
    			LL nq=++nod; len[nq]=len[p]+1; mark[nq]=mark[q];
    			memcpy(son[nq],son[q],sizeof(son[q]));
    			fail[nq]=fail[q];
    			fail[np]=fail[q]=nq;
    			while(p&&son[p][c]==q){
    				son[p][c]=nq;
    				p=fail[p];
    			}
    		}
    	}
    }
    struct node{
    	LL to,next;
    }dis[maxn]; 
    LL num,head[maxn];
    inline void Add(LL u,LL v){
    	dis[++num]=(node){v,head[u]},head[u]=num;
    }
    void Dfs(LL u){
    	for(LL i=head[u];i;i=dis[i].next)
    	    Dfs(dis[i].to);
    	for(LL i=head[u];i;i=dis[i].next){
    		LL v(dis[i].to);
    		if(mark[v]==-1||mark[u]!=mark[v]){
    		    mark[u]=-1;
    		    break;
    		}
    	}
    }
    int main(){
    	scanf("%d%d",&n);
    	for(LL i=1;i<=n;++i){
    		cin>>s;
    		lst=1;
    		for(LL j=0,Len=s.length();j<Len;++j)
    		    Insert(s[j]-'a',i);
    	}
    	for(LL i=1;i<=nod;++i)
    		Add(fail[i],i);
    	Dfs(1);
    	for(LL i=1;i<=nod;++i)
    	    if(mark[i]!=-1)
    	        ans[mark[i]]+=len[i]-len[fail[i]];
    	for(LL i=1;i<=n;++i)
    	    printf("%d
    ",ans[i]);
    	return 0;
    }
    
  • 相关阅读:
    Linux 重新挂载分区的方法
    SQL复习三(子查询)
    SQL复习四(完整性约束)
    SQL 复习二(数据查询语言)
    SQL复习一(基础知识)
    在windos 环境下安装
    tt程序分析(一)
    单例模式Singleton
    用命令行使用soot反编译生成jimple
    在win10环境下安装eclipse mars版本
  • 原文地址:https://www.cnblogs.com/y2823774827y/p/10318489.html
Copyright © 2020-2023  润新知