HUSTOJ 2796 && SPOJ1811

传送门: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 }

时间: 2024-10-10 16:10:32

HUSTOJ 2796 && SPOJ1811的相关文章

研(tu)究(cao)SFTP(HUSTOJ)……

学校题库加数据,HUSTOJ一点也不人道,数据不能一起加,只能一个一个手动加,20组数据一共40个文件真是累-- 于是SFTP一发,发现在外网下没root权限不能加数据--woc 试了很多方法,最终都指向开一个新账户然后赋予root权限,但是太不安全了所以没敢试(好歹也是学校财产--) 忍了,手动添加20组数据. 不过putty上去可以sudo su到root权限,并且可以给SPJ加权限使其运行,这个还有用-- 如果需要在外网向服务器传数据或者SPJ源文件就手动吧没人能救了--加SPJ的话put

最新的hustoj搭建姿势

试着照某度上的教程搭了一下hustoj,出了一些问题,之前的搭建姿势很多已经不适用了,重新整理一下思路:首先虚拟机安装了Elementory OS (基于Ubuntu的衍生版)按惯例,先装Mysql: apt-get installmysql-server mysql-client安装Apache2: apt-get install apache2安装php7,一些教程不适用了: apt-get install php7.0 libapache2-mod-php7.0更新数据: sudo apt

spoj1811 Longest Common Substring,后缀自动机

spoj1811LCS 问两个字符串最长公共子串. 做法很简单.匹配成功,则tl++,失败,从父指针回退,tl=t[now].len. 从这题可以清楚了解后缀自动机fa指针的性质: 指向一个状态,这个状态的接受串s[x..x+i]是与当前状态的接受串后缀s[j-i..j]匹配是最长的一个. 这里是不是发现了一个和KMP很像的性质? KMP在失配时通过next数组回退,那么这个回退到的位置i是s[0..i]与当前串的后缀s[j-i..j]匹配最长的一个. 所以. 利用后缀自动机可以求解一个串的子串

[poj 2796]单调栈

题目链接:http://poj.org/problem?id=2796 单调栈可以O(n)得到以每个位置为最小值,向左右最多扩展到哪里. #include<cstdio> #include<algorithm> #include<stack> using namespace std; const int maxn=100005; int a[maxn]; int l[maxn]; int r[maxn]; long long pre[maxn]; stack< p

搭建hustoj

环境:centos6.5 + LAMP环境 LAMP环境的搭建可以参考下面这篇文章 http://www.cnblogs.com/yoke/p/7257184.html 搭建完LAMP环境之后可以按照一下步骤安装hustoj 1 yum install update //更新数据 2 sudo yum install subversion //安装svn 3 sudo svn co https://github.com/zhblue/hustoj/trunk/trunk/install hust

【spoj1811 &amp; spoj1812 - LCS1 &amp; LCS2】sam

spoj1811  给两个长度小于100000的字符串 A 和 B,求出他们的最长公共连续子串. 先将串 A 构造为 SAM ,然后用 B 按如下规则去跑自动机.用一个变量 lcs 记录当前的最长公共子串,初始化为0.设当前状态结点为 p,要匹配的字符为 c,若 go[c] 中有边,说明能够转移状态,则转移并 lcs++:若不能转移则将状态移动到 p 的 par ,如果仍然不能转移则重复该过程直到 p 回到根节点,并将 lcs 置为 0:如果在上一个过程中进入了能够转移的状态,则设 lcs 为当

hustoj升级

sudo su svn up hustoj-read-only cd hustoj-read-only cd core sudo ./make.sh 有冲突 全部回答r http://www.hustoj.com/?p=47 OJ技术思考:评测安全 https://zhuanlan.zhihu.com/p/26984739

HUSTOJ的Windows版评判内核(限制内存使用)

HUSTOJ的Windows版评判内核(一) 作者:游蓝海 个人主页:http://blog.csdn.net/you_lan_hai 2013.4.9 注:最新版本项目地址:https://github.com/NsLib/FreeJudger.新版FreeJudger,跟我之前写的这个已经完全不一样了,之前的这个废除.虽然现在工作忙,但我们会继续开发FreeJudger,直到功能完善,详见:HUSTOJ的Windows版评判内核(二) 在线评测系统(Online Judge System,O

hustoj ubuntu14.04-i386 安装流程

Ubuntu14.04 i386下hustoj安装的步骤 1.安装mysql apt-get install mysql-server mysql-client 2.安装 apache2 apt-get install apache2 这里要说明一下的就是 ubuntu 下的 apache 默认网页执行文件夹在 /var/www/ 下面,配置文件在 /etc/apache2/apache2.conf ,配置文件子目录在 /etc/apache2/ 下 进入火狐浏览器,键入 http://loca