首页 > 其他 > 详细

CF 149E Martian Strings 后缀自动机

时间:2019-08-21 20:27:57      阅读:234      评论:0      收藏:0      [点我收藏+]

Code: 

#include <cstdio> 
#include <cstring> 
#include <algorithm> 
#define N 200004 
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std;    
inline void getmin(int &a,int b) { if(b<a)a=b; } 
inline void getmax(int &a,int b) { if(b>a)a=b; } 
int a[1002],b[1002],n; 
char str[N],P[N];   
struct SAM 
{ 
    int c[N],rk[N],tot,last; 
    struct Node { int len,ch[27],f,minv,maxv; }t[N]; 
    void init() { last=tot=1; } 
    inline void extend(int c,int lst) 
    {
        int np=++tot,p=last; 
        last=np, t[np].len=t[p].len+1; 
        while(p&&!t[p].ch[c]) t[p].ch[c]=np,p=t[p].f;  
        if(!p) t[np].f=1;
        else 
        {
            int q=t[p].ch[c]; 
            if(t[q].len==t[p].len+1) t[np].f=q; 
            else 
            {
                int nq=++tot;
                t[nq].len=t[p].len+1,t[nq].minv=t[nq].maxv=t[q].maxv;   
                memcpy(t[nq].ch,t[q].ch,sizeof(t[q].ch)); 
                t[nq].f=t[q].f,t[q].f=t[np].f=nq;   
                while(p&&t[p].ch[c]==q) t[p].ch[c]=nq,p=t[p].f;   
            }
        }   
        t[np].minv=t[np].maxv=lst; 
    }       
    inline void prepare() 
    { 
        int i,u; 
        for(i=1;i<=tot;++i) c[i]=0;  
        for(i=1;i<=tot;++i) ++c[t[i].len];   
        for(i=1;i<=tot;++i) rk[c[t[i].len]--]=i;  
        for(i=tot;i>=1;--i) 
            u=rk[i],getmin(t[t[u].f].minv,t[u].minv),getmax(t[t[u].f].maxv,t[u].maxv);      
    }
}t1,t2;  
int main() 
{
    int i,j,m,re=0,ans=0; 
    // setIO("input"); 
    t1.init(),t2.init();    
    scanf("%s",str+1),n=strlen(str+1); 
    for(i=1;i<=n;++i) t1.extend(str[i]-‘A‘,i); 
    for(i=n;i>=1;--i) t2.extend(str[i]-‘A‘,i); 
    t1.prepare(),t2.prepare(),scanf("%d",&m); 
    for(i=1;i<=m;++i) 
    {
        int len,p; 
        scanf("%s",P+1),len=strlen(P+1),memset(a,0,sizeof(a)),memset(b,0,sizeof(b));       
        for(p=j=1;j<=len;++j) 
        {
            int c=P[j]-‘A‘;      
            if(t1.t[p].ch[c]) a[j]=t1.t[t1.t[p].ch[c]].minv,p=t1.t[p].ch[c]; else break; 
        } 
        for(p=1,j=len;j>=1;--j) 
        {
            int c=P[j]-‘A‘; 
            if(t2.t[p].ch[c]) b[j]=t2.t[t2.t[p].ch[c]].maxv,p=t2.t[p].ch[c]; else break;  
        } 
        re=0;   
        for(j=1;j<len;++j) {
            if(a[j]&&b[j+1]&&a[j]<b[j+1]) re=1;     
        }
        if(a[len]) re=1; 
        if(len==1) re=0;   
        ans+=re;  
    }
    printf("%d\n",ans); 
    return 0; 
}

  

CF 149E Martian Strings 后缀自动机

原文:https://www.cnblogs.com/guangheli/p/11390699.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!