zoukankan      html  css  js  c++  java
  • BZOJ4516: [Sdoi2016]生成魔咒

    Description

    魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示。例如可以将魔咒字符 1、2 拼凑起来形成一个魔咒串 [1,2]。
    一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒。
    例如 S=[1,2,1] 时,它的生成魔咒有 [1]、[2]、[1,2]、[2,1]、[1,2,1] 五种。S=[1,1,1] 时,它的生成魔咒有 [1]、
    [1,1]、[1,1,1] 三种。最初 S 为空串。共进行 n 次操作,每次操作是在 S 的结尾加入一个魔咒字符。每次操作后都
    需要求出,当前的魔咒串 S 共有多少种生成魔咒。
     

    Input

    第一行一个整数 n。
    第二行 n 个数,第 i 个数表示第 i 次操作加入的魔咒字符。
    1≤n≤100000。,用来表示魔咒字符的数字 x 满足 1≤x≤10^9

    Output

    输出 n 行,每行一个数。第 i 行的数表示第 i 次操作后 S 的生成魔咒数量

     

    Sample Input

    7
    1 2 3 3 3 1 2

    Sample Output

    1
    3
    6
    9
    12
    17
    22
     
    强上后缀自动机,用个map存边就行了。
    时间复杂度O(NlogN)。
    #include<cstdio>
    #include<cctype>
    #include<map>
    #include<cstring>
    #include<algorithm>
    #define rep(i,s,t) for(int i=s;i<=t;i++)
    #define dwn(i,s,t) for(int i=s;i>=t;i--)
    #define ren for(int i=first[x];i;i=next[i])
    using namespace std;
    const int BufferSize=1<<16;
    char buffer[BufferSize],*head,*tail;
    inline char Getchar() {
    	if(head==tail) {
    		int l=fread(buffer,1,BufferSize,stdin);
    		tail=(head=buffer)+l;
    	}
    	return *head++;
    }
    inline int read() {
        int x=0,f=1;char c=Getchar();
        for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
        for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
        return x*f;
    }
    const int maxn=200010;
    long long ans;
    map<int,int>to[maxn];
    int l[maxn],fa[maxn],cnt=1,last=1;
    void extend(int c) {
    	int p,q,np,nq;p=last;last=np=++cnt;l[np]=l[p]+1;
    	for(;!to[p][c];p=fa[p]) to[p][c]=np;
    	if(!p) fa[np]=1;
    	else {
    		q=to[p][c];
    		if(l[p]+1==l[q]) fa[np]=q;
    		else {
    			l[nq=++cnt]=l[p]+1;
    			ans-=l[q]-l[fa[q]];
    			fa[nq]=fa[q];fa[q]=fa[np]=nq;
    			ans+=l[q]-l[fa[q]];ans+=l[nq]-l[fa[nq]];
    			to[nq]=to[q];
    			for(;to[p][c]==q;p=fa[p]) to[p][c]=nq;
    		}
    	}
    	ans+=l[np]-l[fa[np]];
    }
    int main() {
    	dwn(i,read(),1) {
    		extend(read());
    		printf("%lld
    ",ans);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    AtCoder Tenka1 Programmer Beginner Contest 解题报告
    BZOJ4401: 块的计数 思维题
    LOJ#2170. 「POI2011」木棍 Sticks
    LOJ#2632. 「BalticOI 2011 Day1」打开灯泡 Switch the Lamp On
    LuoguP3183 [HAOI2016]食物链 记忆化搜索
    BZOJ2818: Gcd 欧拉函数
    BZOJ3942: [Usaco2015 Feb]Censoring 栈+KMP
    适用于Java的嵌入式脚本语言
    oracle goldengate的两种用法
    手滑把库给删了,跑路前应该做的事。。。
  • 原文地址:https://www.cnblogs.com/wzj-is-a-juruo/p/5481801.html
Copyright © 2011-2022 走看看