码迷,mamicode.com
首页 > 其他好文 > 详细

HUSTOJ 2796 && SPOJ1811

时间:2016-05-31 20:46:42      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

传送门:http://begin.lydsy.com/JudgeOnline/problem.php?id=2796

题解:后缀自动机,很裸,但是感觉对后缀自动机还不是特别理解,毕竟我太蒟蒻,等我精通了,再写对它的理解吧。。。

   还有写这道题的时候发现数组下标又时候是负数竟然不会爆。。。。。。因为这道题有大写也有小写,可我只开了26竟然A了(后面才发现)。。。。懒得改了

代码:

技术分享
 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #define N 250005
 6 using namespace std;
 7 struct data{
 8     int go[26],val,fa;
 9 }son[N*2];
10 int n,m,tot,last,root,sum,ans;
11 char s[N],c[N];
12 int newnode(int x){son[++tot].val=son[x].val+1; return tot;}
13 void extend(int x)
14 {
15     int p=last,np=newnode(p);
16     while (p && !son[p].go[x]) son[p].go[x]=np,p=son[p].fa;
17     if (!p) son[np].fa=root;
18     else
19     {
20         int q=son[p].go[x];
21         if (son[q].val==son[p].val+1) son[np].fa=q;
22         else
23         {
24             int nq=newnode(p);
25             memcpy(son[nq].go,son[q].go,sizeof(son[q].go));
26             son[nq].fa=son[q].fa;
27             son[q].fa=son[np].fa=nq;
28             while (p && son[p].go[x]==q) son[p].go[x]=nq,p=son[p].fa;
29         }
30     }
31     last=np;
32 }
33 int main()
34 {
35     last=root=tot=1; 
36     scanf("%s",s+1); scanf("%s",c+1);
37     n=strlen(s+1); m=strlen(c+1);
38     for (int i=1; i<=n; i++) extend(s[i]-a);
39     for(int i=1,pp=root;i<=m;i++){
40         int f=c[i]-a;
41         if(son[pp].go[f]) sum++,pp=son[pp].go[f];
42         else{
43             while(pp && !son[pp].go[f]) pp=son[pp].fa;
44             if(pp) sum=son[pp].val+1,pp=son[pp].go[f];
45             else sum=0,pp=root;
46         }
47         ans=max(ans,sum);
48     }
49     printf("%d\n",ans);
50 }
View Code

 

HUSTOJ 2796 && SPOJ1811

标签:

原文地址:http://www.cnblogs.com/HQHQ/p/5547192.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!