zoukankan      html  css  js  c++  java
  • HIHOcoder 1441 后缀自动机一·基本概念

    思路

    SAM的概念题
    暴力模拟就好了

    代码

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <set>
    using namespace std;
    set<int> St[2511];
    const int base = 131;
    int setcnt=0,minlens[2511],minlent[2511],maxlens[2511],maxlent[2511],n,lens,lent;
    char s[2511],t[2511];
    unsigned long long hashs[120],powh[120]; 
    void init(void){
        for(int i=1;i<=2510;i++){
            minlent[i]=0x3f3f3f3f;
            maxlens[i]=1;
        }
        powh[0]=1;
        for(int i=1;i<=100;i++)
            powh[i]=powh[i-1]*base;
    }
    unsigned long long hashf(int l,int r){
        return hashs[r]-hashs[l-1]*powh[r-l+1];
    }
    int main(){
        init();
        scanf("%s",s+1);
        lens=strlen(s+1);
        for(int i=1;i<=lens;i++){
            hashs[i]=hashs[i-1]*base+s[i];
        }
        for(int l=1;l<=lens;l++)
            for(int r=l;r<=lens;r++){
                set<int> S;
                while(S.size())
                    S.erase(S.begin());
                for(int i=1;i<=lens-(r-l+1)+1;i++)
                    if(hashf(i,i+(r-l+1)-1)==hashf(l,r))
                        S.insert(i+(r-l+1)-1);
                bool f=false;
                // for(int k=l;k<=r;k++)
                //     putchar(s[k]);
                // putchar('
    ');
                // for(set<int>::iterator it=S.begin();it!=S.end();it++)
                //     printf("%d ",(*it));
                // printf("
    ");
                for(int i=1;i<=setcnt;i++){
                    if(S==St[i]){
                        // printf("into %d
    ",i);
                        f=true;
                        if(minlent[i]-minlens[i]+1>r-l+1){
                            minlent[i]=r;
                            minlens[i]=l;
                        }
                        if(maxlent[i]-maxlens[i]+1<r-l+1){
                            maxlent[i]=r;
                            maxlens[i]=l;
                        }
                        break;
                    }
                }
                if(!f){
                    // printf("New
    ");
                    ++setcnt;
                    St[setcnt]=S;
                    minlens[setcnt]=maxlens[setcnt]=l;
                    minlent[setcnt]=maxlent[setcnt]=r;
                }
            }
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%s",t+1);
            lent=strlen(t+1);
            unsigned long long hashval=0;
            set<int> S;
            while(S.size())
                S.erase(S.begin());
            for(int j=1;j<=lent;j++)    
                hashval=hashval*base+t[j];
            // printf("hasf=%lld %lld
    ",hashf(2,5),hashval);
            for(int j=1;j<=lens-lent+1;j++)
                if(hashf(j,j+lent-1)==hashval)
                    S.insert(j+lent-1);
            // for(set<int>::iterator it=S.begin();it!=S.end();it++)
            //     printf("%d ",(*it));
            // printf("
    ");
            for(int j=1;j<=setcnt;j++){
                if(S==St[j]){
                    for(int k=minlens[j];k<=minlent[j];k++)
                        putchar(s[k]);
                    putchar(' ');
                    for(int k=maxlens[j];k<=maxlent[j];k++)
                        putchar(s[k]);
                    putchar(' ');
                    for(set<int>::iterator it = S.begin();it!=S.end();it++)
                        printf("%d ",(*it));
                    printf("
    ");
                    break;
                }
            }
        }
        return 0;
    }
    
  • 相关阅读:
    SPOJ ADAFIELD Ada and Field(STL的使用:set,multiset,map的迭代器)题解
    hdu 6444 网络赛 Neko's loop(单调队列 + 裴蜀定理)题解
    hdu6446 网络赛 Tree and Permutation(树形dp求任意两点距离之和)题解
    HDU6447 网络赛 YJJ's Salesman(DP + 线段树)题解
    HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解
    BZOJ 3155 Preprefix sum
    BZOJ 2743 采花
    BZOJ 3339 Rmq Problem
    BZOJ 1660 乱发节
    BZOJ 3531 旅行
  • 原文地址:https://www.cnblogs.com/dreagonm/p/10460771.html
Copyright © 2011-2022 走看看