• 后缀自动机——ICPC Latin American Regional Contests 2019 G


    /*
    对模式串s建立sam,然后每个串t到sam里去跑,
    每次跑到不能再往下匹配了,ans+1,对t[i]后面的字符再从头开始跑sam 
    如果有sam里没有的字符出现了,那答案必定是-1 
    */ 
    #include<bits/stdc++.h>
    using namespace std;
    #define N 400005
    
    struct SAM{
        int cnt,last;
        int nxt[N][26];
        int link[N];
        int len[N];
        SAM(){cnt=last=1;}
        void insert(int c){
            int p=last,np=last=++cnt;
            len[np]=len[p]+1;
            for(;p&&!nxt[p][c];p=link[p])
                nxt[p][c]=np;
            if(!p){link[np]=1;return;}
            
            int q=nxt[p][c];
            if(len[q]==len[p]+1){link[np]=q;return;}
            
            int clone=++cnt;
            link[clone]=link[q];
            len[clone]=len[p]+1;
            memcpy(nxt[clone],nxt[q],sizeof nxt[q]);
            link[q]=link[np]=clone;
            for(;p&&nxt[p][c]==q;p=link[p])
                nxt[p][c]=clone;
        }
    }tr;
    
    char s[N],t[N];
    int len;
    
    int main(){
        scanf("%s",s);
        len=strlen(s);
        for(int i=0;i<len;i++)
            tr.insert(s[i]-'A');
        
        int T;cin>>T;
        while(T--){
            scanf("%s",t);
            len=strlen(t);
            int i=0,ans=0;
            while(i<len){
                int c=t[i]-'A';
                if(!tr.nxt[1][c]){
                    ans=-1;break;
                }
                int p=1;
                while(i<len){
                    int c=t[i]-'A';
                    if(tr.nxt[p][c]) 
                        p=tr.nxt[p][c];
                    else break;
                    i++;
                }
                ans++;
            }
            
            cout<<ans<<'
    ';
        }
    } 
  • 相关阅读:
    (转)HTTP协议
    函数深入理解---函数的定义方式
    DOM模型和事件处理---事件处理
    DOM模型和事件处理---节点操作
    DOM模型和事件处理---基本操作
    常用知识
    窗口对象
    简单的事件处理
    Grunt
    基本操作
  • 原文地址:https://www.cnblogs.com/zsben991126/p/12674184.html
Copyright © 2020-2023  润新知