zoukankan      html  css  js  c++  java
  • hihocoder #1445 : 后缀自动机二·重复旋律5

    #1445 : 后缀自动机二·重复旋律5

    时间限制:10000ms
    单点时限:2000ms
    内存限制:512MB

    描述

    小Hi平时的一大兴趣爱好就是演奏钢琴。我们知道一个音乐旋律被表示为一段数构成的数列。

    现在小Hi想知道一部作品中出现了多少不同的旋律?

    解题方法提示

    输入

    共一行,包含一个由小写字母构成的字符串。字符串长度不超过 1000000。

    输出

    一行一个整数,表示答案。

    样例输入
    aab
    样例输出
    5

    代码:

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    //by NeighThorn
    using namespace std;
    
    const int maxn=2000000+5;
    
    int last=1,tail=1,Min[maxn],Max[maxn],nxt[maxn][26],fail[maxn];
    
    char s[maxn];
    
    inline void build(char *s){
    	while(*s){
    		int p=last,t=++tail,c=*s++-'a';
    		Max[t]=Max[p]+1;
    		while(p&&!nxt[p][c])
    			nxt[p][c]=t,p=fail[p];
    		if(p){
    			int q=nxt[p][c];
    			if(Max[q]==Max[p]+1)
    				fail[t]=q,Min[t]=Max[q]+1;
    			else{
    				int k=++tail;
    				fail[k]=fail[q];
    				fail[t]=fail[q]=k;
    				Max[k]=Max[p]+1;
    				Min[q]=Max[k]+1;
    				Min[t]=Max[k]+1;
    				Min[k]=Max[fail[k]]+1;
    				memcpy(nxt[k],nxt[q],26*sizeof(int));
    				while(nxt[p][c]==q)
    					nxt[p][c]=k,p=fail[p];
    			}
    		}
    		else
    			fail[t]=1,Min[t]=1;
    		last=t;
    	}
    }
    
    inline void calc(void){
    	long long ans=0;
    	for(int i=2;i<=tail;i++)
    		ans+=Max[i]-Min[i]+1;
    	printf("%lld
    ",ans);
    }
    
    signed main(void){
    	scanf("%s",s);build(s);calc();
    	return 0;
    }
    

      


    $By NeighThorn$

     
     
  • 相关阅读:
    npm 全局执行 update 、 outdated 出现 npm-debug.log 404 错误的问题
    python 爬虫爬取内容时, xa0 、 u3000 的含义
    SCNU ACM 2016新生赛决赛 解题报告
    SCNU ACM 2016新生赛初赛 解题报告
    【记录】Ubuntu下安装VirtualBox
    Ubuntu16.04 LTS下apt安装WireShark
    Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究
    Ubuntu在wps-office等qt5程序下不能切换中文fcitx输入法的问题
    Ubuntu管理开机启动服务项 -- 图形界面的Boot-up Manager
    解决Ubuntu下Firefox+OpenJDK没有Java插件的问题
  • 原文地址:https://www.cnblogs.com/neighthorn/p/6736860.html
Copyright © 2011-2022 走看看