• 2014-2015 ACM-ICPC, Asia Xian Regional Contest GThe Problem to Slow Down You


    http://blog.csdn.net/u013368721/article/details/42100363  回文树

    建立两棵回文树,然后count处理一遍就可以了,然后顺着这两棵树的边走下去就好了

    #include <iostream>
    #include <algorithm>
    #include <string.h>
    #include <vector>
    #include <cstdio>
    using namespace std;
    const int maxn=300005;
    const int sign_size=26;
    struct Palind_Tree{
     int next[maxn][sign_size];
     int fail[maxn];
     int cnt[maxn];
     int num[maxn];
     int len[maxn];
     int S[maxn];
     int last;
     int n;
     int p;
     int newnode(int l)
     {
         for(int i=0; i<sign_size; i++)next[p][i]=0;
         cnt[p]=0;
         num[p]=0;
         len[p]=l;
         return p++;
     }
     void init()
     {
         p=0;
         newnode(0);
         newnode(-1);
         last=0;
         n=0;
         S[n]=-1;
         fail[0]=1;
     }
     int get_fail(int x)
     {
        while(S[n-len[x]-1]!=S[n])x=fail[x];
        return x;
     }
     void add(int c)
     {
         c-='a';
         S[++n]=c;
         int cur=get_fail(last);
         if(next[cur][c]==0)
         {
             int now=newnode(len[cur]+2);
             fail[now]=next[get_fail( fail[cur] )][c];
             next[cur][c]=now;
             num[now]=num[fail[now]]+1;
         }
         last=next[cur][c];
         cnt[last]++;
     }
     void count()
     {
         for(int i=p-1; i>=0; --i)cnt[fail[i]]+=cnt[i];
     }
    }T1,T2;
    char S[maxn],S2[maxn];
    long long ans=0;
    void dfs(int u,int v)
    {
        for(int i=0; i<sign_size; i++)
        {
            int x=T1.next[u][i],y=T2.next[v][i];
            if(x&&y)
            {
                ans+=(long long)T1.cnt[x]*T2.cnt[y];
                dfs(x,y);
            }
        }
    }
    int main()
    {
        int cas;
        scanf("%d",&cas);
        for(int cc=1; cc<=cas; cc++)
        {
            scanf("%s%s",S,S2);
    
            T1.init();
            T2.init();
            int len1=strlen(S);
            int len2=strlen(S2);
            for(int i=0; i<len1; i++)
                T1.add(S[i]);
            for(int i=0; i<len2; i++)
                T2.add(S2[i]);
            T1.count();
            T2.count();
            ans=0;
            dfs(0,0);
            dfs(1,1);
            printf("Case #%d: %I64d
    ",cc,ans);
        }
        return 0;
    }
  • 相关阅读:
    利用原生JS判断组合键
    MySQL基本操作简述
    Java链接Mysql传输数据
    Java培训--->>基础
    Java基础之字符串-->>字符串处理
    Java基础之结构-->>条件结构与循环结构
    Java基础之数组-->>数组常用操作
    Front End Development Certification (HTML5 and CSS)
    FlexSlider插件的详细设置参数
    常见<meta>的基本用法详解
  • 原文地址:https://www.cnblogs.com/Opaser/p/4924096.html
Copyright © 2020-2023  润新知