• bzoj 4480: [Jsoi2013]快乐的jyy


    Description

    【故事背景】
    JYY在JSOI有很多很多的好朋友,比如PUPPY,KFC还有PUPPUP。因为
    有了这么多的好朋友,所以JYY每天都很快乐。某天,JYY发现好朋友之间关
    系的好坏和名字有很大的关系,比如PUPPY和PUPPUP的关系就特别好,但是
    和KFC的关系就很一般。JYY苦思冥想终于发现了其中的规律,现在JYY想知
    道两个朋友之间关系的好坏,你能帮助JYY么?
    【问题描述】
    给定两个字符串A和B,表示JYY的两个朋友的名字。我们用A(i,j)表示A
    字符串中从第i个字母到第j个字母所组成的子串。同样的,我们也可以定义B(x,y)。
    JYY发现两个朋友关系的紧密程度,等于同时满足如下条件的四元组(i,j,x,y)
    的个数:
    1:1<=i<=j<=|A|
    2:1<=x<=y<=|B|
    3:A(i,j)=B(x,y)
    4:A(i,j)是回文串
    这里表示字符串A的长度。
    JYY希望你帮助他计算出这两个朋友之间关系的紧密程度。

    Solution

    把两个串插入到同一个回文自动机里面 , 记录每一个回文串中两个字符串出现的次数 (size[0/1]).
    相乘就是一组回文串的贡献 , 答案就是 (sum size[i][0]*size[i][1])

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    int nxt[N][26],fa[N],len[N],p=0,n,cnt=-1,sz[N][2],T=0;char s[N];
    inline int newnode(int x){len[++cnt]=x;return cnt;}
    inline void init(){newnode(0),newnode(-1),fa[0]=1;}
    inline int fail(int x,int n){
    	while(s[n]!=s[n-len[x]-1])x=fa[x];
    	return x;
    }
    inline void ins(int c,int n){
    	int x=fail(p,n),t;
    	if(!nxt[x][c]){
    		t=newnode(len[x]+2);
    		fa[t]=nxt[fail(fa[x],n)][c],nxt[x][c]=t;
    	}
    	p=nxt[x][c],sz[p][T]++;
    }
    int main(){
      freopen("pp.in","r",stdin);
      freopen("pp.out","w",stdout);
      scanf("%s",s+1),n=strlen(s+1);
      T=0,init();
      for(int i=1;i<=n;i++)ins(s[i]-'A',i);
      scanf("%s",s+1),T=1,n=strlen(s+1),p=0;
      for(int i=1;i<=n;i++)ins(s[i]-'A',i);
      long long ans=0;
      for(int i=cnt;i>=2;i--){
    	  for(int j=0;j<2;j++)sz[fa[i]][j]+=sz[i][j];
    	  ans+=1ll*sz[i][0]*sz[i][1];
      }
      cout<<ans;
      return 0;
    }
    
    
  • 相关阅读:
    在路上。。。
    DNN模块打包(DNN-ModulePack简称为DNNMP)
    创建一个PortalSettings,这也行。
    对Web 2.0 的体验
    太空旅客 第七位 了
    计划今年每月至少写一篇技术性文章
    检索 COM 类工厂中 CLSID 为 {0002450000000000C000000000000046} 的组件时失败,原因是出现 以下错误: 80070005
    RadGrid RaisePostBackEvent 刷新页面问题。
    做为团队中的一员
    dnn captcha 图片 显示不了 见鬼了
  • 原文地址:https://www.cnblogs.com/Yuzao/p/9310126.html
Copyright © 2020-2023  润新知