zoukankan      html  css  js  c++  java
  • [JZOJ 5129] 字符串

    题意:统计本质不同的串的个数。
    思路:
    显然后缀自动机,对于每个串建一个\(SAM\)统计即可。

    #include <bits/stdc++.h>
    using namespace std;
    int root;
    int lst;
    int tot;
    const int maxn = 2000010;
    const int mod = 1e9+7;
    int son[maxn][26];
    int fa[maxn];
    int d[maxn];
    int f[maxn];
    inline void upd(int &x,int y) {
    	x += y;
    	if(x >= mod) x -= mod;
    }
    inline void extend(int c) {
    	int np = ++tot;
    	int p = lst;
    	d[np] = d[p] + 1;
    	lst = np;
    	for(;p && !son[p][c];son[p][c] = np,p = fa[p]);
    	if(!p) {
    		fa[np] = root;
    	}
    	else {
    		int q = son[p][c];
    		if(d[q] == d[p] + 1) {
    			fa[np] = q;
    		}
    		else {
    			int nq = ++tot;
    			d[nq] = d[p] + 1;
    			for(int i = 0;i < 26; ++i) {
    				son[nq][i] = son[q][i];
    			}
    			fa[nq] = fa[q];
    			fa[q] = fa[np] = nq;
    			for(;p && son[p][c] == q;son[p][c] = nq,p = fa[p]);
    		}
    	}
    }
    int r[maxn];
    int pos[maxn];
    int Order[maxn];
    int n;
    inline bool cmp(int a,int b) {
    	return pos[a] == pos[b] ? d[a] < d[b] : pos[a] < pos[b];
    }
    int main () {
    	freopen("str.in","r",stdin);
    	freopen("str.out","w",stdout);
    	scanf("%d",&n);
    	for(int i = 1;i <= n; ++i) {
    		char s[maxn];
    		scanf("%s",s);
    		int len = strlen(s);
    		root = ++tot;
    		lst = root;
    		r[i] = lst;
    		for(int j = 0;j < len; ++j) {
    			extend(s[j] - 'a');
    		}
    		for(int j = r[i];j <= tot; ++j) {
    			pos[j] = i;
    		}
    	}
    	r[n + 1] = tot + 1;
    	for(int i = n;i >= 1; --i) {
    		for(int j = r[i];j < r[i + 1]; ++j) {
    			for(int k = 0;k < 26; ++k) {
    				if(!son[j][k]) {
    					son[j][k] = son[r[i + 1]][k];
    				}
    			}
    		}
    	}
    	for(int i = 1;i <= tot; ++i) {
    		Order[i] = i;
    	}
    	sort(Order+1,Order+tot+1,cmp);
    	for(int i = tot;i; --i) {
    		int tmp = Order[i];
    		f[tmp] = 1;
    		for(int j = 0;j < 26; ++j) {
    			upd(f[tmp],f[son[tmp][j]]);
    		}
    	}
    	printf("%d\n",f[1]);
    	return 0;
    }
    
  • 相关阅读:
    重定义自定义类型
    范式
    管理
    JVM调优[转]
    I/O相关的等待事件
    等待事件监测性能瓶颈
    Shared pool
    SQL*Plus和PL/SQL
    Oracle优化器和执行计划
    10053事件
  • 原文地址:https://www.cnblogs.com/akoasm/p/9580249.html
Copyright © 2011-2022 走看看