zoukankan      html  css  js  c++  java
  • bzoj 2084: [Poi2010]Antisymmetry【回文自动机】

    manacher魔改,hash+二分都好写,但是我魔改了个回文自动机就写自闭了orz
    根本上来说只要把==改成!=即可,但是这样一来很多停止条件就没了,需要很多特判手动刹车,最后统计一下size即可

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int N=500005;
    int n,ch[N][2],fa[N],dis[N],si[N],con=1,la;
    long long ans;
    char s[N];
    void ins(int c,int w)
    {
    	int p=la;
    	for(;p!=1&&(s[w-1-dis[p]]==s[w]||w-1-dis[p]==0);p=fa[p]);
    	if(s[w-1-dis[p]]==s[w]||w-1-dis[p]==0)
    	{
    		la=0;
    		return;
    	}
    	if(ch[p][c]==0)
    	{
    		int cur=++con,q=fa[p];
    		for(;q!=1&&(s[w-1-dis[q]]==s[w]||w-1-dis[q]==0);q=fa[q]);
    		if(s[w-1-dis[q]]==s[w])
    			fa[cur]=0;
    		else
    			fa[cur]=ch[q][c];
    		ch[p][c]=cur,dis[cur]=dis[p]+2;
    	}
    	si[la=ch[p][c]]++;
    }
    int main()
    {
    	scanf("%d%s",&n,s+1);
    	fa[0]=1,dis[1]=-1;
    	for(int i=1;i<=n;i++)
    		ins(s[i]-'0',i);
    	for(int i=con;i>=1;i--)
    		si[fa[i]]+=si[i],ans+=si[i];
    	// cerr<<con<<endl;
    	// for(int i=1;i<=con;i++)
    		// cerr<<si[i]<<" "<<dis[i]<<endl;;
    	// cerr<<endl;
    	printf("%lld
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    遍历文件夹及子文件夹_函数
    wbadmin与vssadmin
    WSB备份到远程共享文件夹的限制
    Linux 性能工具集
    shell 与 空格
    Git 仓库结构 (二)***
    Linux下scp的用法***
    FINDSTR 命令使用详解
    Git 的origin和master分析 ***
    Git push *****
  • 原文地址:https://www.cnblogs.com/lokiii/p/10012637.html
Copyright © 2011-2022 走看看