HDU-4622-Reincarnation

来源:互联网 发布:淘宝旺铺基础版店招 编辑:程序博客网 时间:2024/06/07 05:14

昨天做练习的时候没有做出来,后来看到这个题要用后缀自动机做,看了下,用模板做的

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=4100;const int maxm=10010;struct suffix_automaton{    char str[maxn];    int son[maxn][26],pre[maxn],step[maxn],last,total;    inline void push_back(int v)    {step[++total]=v;    }    void Extend(int ch)    {push_back(step[last]+1);int p=last,np=total;for(;p&&!son[p][ch];p=pre[p])    son[p][ch]=np;if(!p)    pre[np]=1;else{    int q=son[p][ch];    if(step[q]!=step[p]+1)    {push_back(step[p]+1);int nq=total;memcpy(son[nq],son[q],sizeof(son[q]));pre[nq]=pre[q];pre[q]=pre[np]=nq;for(;p&&son[p][ch]==q;p=pre[p])    son[p][ch]=nq;    }    elsepre[np]=q;}last=np;    }    void Init()    {total=last=1;memset(son,0,sizeof(son));memset(pre,0,sizeof(pre));memset(step,0,sizeof(step));    }    int GetAns()    {int ans=0;for(int i=total;i>0;i--)    ans+=step[i]-step[pre[i]];return ans;    }}suf;struct Node{    int l;    int r;    int id;    bool operator <(const Node &a)const    {if(a.l==l)    return r<a.r;return l<a.l;    }}q[maxm];int m,ans[maxm];int main(){    int T;    scanf("%d",&T);    while(T--)    {scanf("%s",suf.str);scanf("%d",&m);for(int i=1;i<=m;i++){    scanf("%d%d",&q[i].l,&q[i].r);    q[i].l--;    q[i].r--;    q[i].id=i;}sort(q+1,q+m+1);suf.Init();for(int i=q[1].l;i<=q[1].r;i++)    suf.Extend(suf.str[i]-'a');ans[q[1].id]=suf.GetAns();for(int i=2;i<=m;i++){    if(q[i].l!=q[i-1].l)    {suf.Init();for(int j=q[i].l;j<=q[i].r;j++)    suf.Extend(suf.str[j]-'a');ans[q[i].id]=suf.GetAns();    }    else    {if(q[i].r==q[i-1].r)    ans[q[i].id]=ans[q[i-1].id];else{    for(int j=q[i-1].r+1;j<=q[i].r;j++)suf.Extend(suf.str[j]-'a');    ans[q[i].id]=suf.GetAns();}    }}for(int i=1;i<=m;i++)    printf("%d\n",ans[i]);    }    return 0;}


原创粉丝点击