zoukankan      html  css  js  c++  java
  • 【文文殿下】[51nod1469] 淋漓尽致子串

    SAM的经典应用

    一个状态的SIze==1绝对不合法。

    一个状态在parent树上有一个Size>1的后继绝对不合法(前面可以再补字符)

    一个状态可以转移到Size>1的节点绝对不合法,因为可以在后面补字符。

    #include<cstdio>
    #include<cstring>
    #include<map>
    typedef long long ll;
    const int maxn = 2e5+20;
    int par[maxn],mx[maxn],tr[maxn][26],Right[maxn],c[maxn],id[maxn];
    char A[maxn>>1];
    int tot=0;
    int cnt = 1,last = 1;
    ll ans = 0;
    void extend(int x) {
    	int np = ++cnt,p = last;
    	Right[np]=1;
    	mx[np]=mx[p]+1;
    	last=np;
    	while(p&&!tr[p][x]) tr[p][x]=np,p=par[p];
    	if(!p) par[np]=1;
    	else {
    		int q = tr[p][x];
    		if(mx[q]==mx[p]+1) {
    			par[np]=q;
    		}
    		else {
    			int nq = ++cnt;
    			mx[nq]=mx[p]+1;
    			memcpy(tr[nq],tr[q],sizeof tr[nq]);
    			par[nq]=par[q];
    			par[q]=par[np]=nq;
    			while(p&&tr[p][x]==q) tr[p][x]=nq,p=par[p];
    		}
    	}
    	return;
    }
    int n,k,t;
    inline void topsort() {
    	for(int i = 1;i<=cnt;++i) ++c[mx[i]];
    	for(int i = 1;i<=n;++i) c[i]+=c[i-1];
    	for(int i = 1;i<=cnt;++i) id[c[mx[i]]--]=i;
    	for(int i = cnt;i;--i) Right[par[id[i]]]+=Right[id[i]];
    	return;
    }
    bool vis[maxn];
    int main() {
    	scanf("%s",A+1);
    	n = strlen(A+1);
    	for(int i = 1;i<=n;++i) extend(A[i]-'a');
    	topsort();Right[0]=0;
    	for(int i =cnt;i;--i) {
    		if(Right[id[i]]>1||vis[id[i]]) vis[par[id[i]]]=1;
    	}
    	for(int i = 1;i<=cnt;++i) if(Right[i]<=1) vis[i]=1;
    	for(int i = 1;i<=cnt;++i) for(int j = 0;j<26;++j) if(Right[tr[i][j]]>1) vis[i]=1;
    	for(int i = 2;i<=cnt;++i) if(!vis[i]) ++ans;
    	printf("%lld
    ",ans);
    	return 0;
    }
    
    
  • 相关阅读:
    Centos-706防火墙端口操作
    Centos-7.6安装DotnetCore3.1
    Centos-610-源码安装GIT
    Centos-610-安装Jenkins2.222.4
    Centos610-安装NodeJs
    Windows:开发环境Word,PPT,EXCEL com+组件配置
    DCom配置我的电脑有个红色向下的箭头
    NPM包管理工具NRM
    Win10-Jvm调优之工具基本配置、使用(二)
    Win10-Jvm调优之工具基本配置、使用(一)
  • 原文地址:https://www.cnblogs.com/Syameimaru/p/9999071.html
Copyright © 2011-2022 走看看