HUSTOJ 2796 && SPOJ1811
2024-10-13 21:33:38
传送门:http://begin.lydsy.com/JudgeOnline/problem.php?id=2796
题解:后缀自动机,很裸,但是感觉对后缀自动机还不是特别理解,毕竟我太蒟蒻,等我精通了,再写对它的理解吧。。。
还有写这道题的时候发现数组下标又时候是负数竟然不会爆。。。。。。因为这道题有大写也有小写,可我只开了26竟然A了(后面才发现)。。。。懒得改了
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define N 250005
using namespace std;
struct data{
int go[],val,fa;
}son[N*];
int n,m,tot,last,root,sum,ans;
char s[N],c[N];
int newnode(int x){son[++tot].val=son[x].val+; return tot;}
void extend(int x)
{
int p=last,np=newnode(p);
while (p && !son[p].go[x]) son[p].go[x]=np,p=son[p].fa;
if (!p) son[np].fa=root;
else
{
int q=son[p].go[x];
if (son[q].val==son[p].val+) son[np].fa=q;
else
{
int nq=newnode(p);
memcpy(son[nq].go,son[q].go,sizeof(son[q].go));
son[nq].fa=son[q].fa;
son[q].fa=son[np].fa=nq;
while (p && son[p].go[x]==q) son[p].go[x]=nq,p=son[p].fa;
}
}
last=np;
}
int main()
{
last=root=tot=;
scanf("%s",s+); scanf("%s",c+);
n=strlen(s+); m=strlen(c+);
for (int i=; i<=n; i++) extend(s[i]-'a');
for(int i=,pp=root;i<=m;i++){
int f=c[i]-'a';
if(son[pp].go[f]) sum++,pp=son[pp].go[f];
else{
while(pp && !son[pp].go[f]) pp=son[pp].fa;
if(pp) sum=son[pp].val+,pp=son[pp].go[f];
else sum=,pp=root;
}
ans=max(ans,sum);
}
printf("%d\n",ans);
}
最新文章
- Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理2
- 转载:java程序打包成jar 配置文件信息路径
- C#复习⑧
- 用live writer写博客
- C++中 :: 的意思
- 161114、websocket实现心跳重连
- Mysql-学习笔记(==》插入修改数据二)
- [html] 前端角度出发做好SEO需要考虑什么
- SonarLint插件的安装与使用
- qt 状态栏
- 课堂里学不到的C与C++那些事(一)
- MVC5学习相关资源整理
- escape、unescape、encodeURIComponent、decodeURLComponent
- 【vue】函数式组件
- TypeScript: type alias 与 interface
- Oracle使用PLSQL导入数据后中文乱码的解决方法
- Unity3D游戏开发框架-资源管理类ResourceManage
- Android之sqlite3命令行简单使用
- hdu-1061(快速幂)
- Swift2.0语言教程之类的属性