博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SPOJ 10570 LONGCS - Longest Common Substring
阅读量:6707 次
发布时间:2019-06-25

本文共 3261 字,大约阅读时间需要 10 分钟。

思路

和一个思路,改成多组数据就有三倍经验了

代码

#include 
#include
#include
using namespace std;int maxlen[202000],suflink[202000],barrel[202000],trans[202000][26],Nodecnt,ranks[202000];int New_state(int _maxlen,int *_trans,int _suflink){ ++Nodecnt; maxlen[Nodecnt]=_maxlen; if(_trans) for(int i=0;i<26;i++) trans[Nodecnt][i]=_trans[i]; suflink[Nodecnt]=_suflink; return Nodecnt;}int add_len(int u,int c){ int z=New_state(maxlen[u]+1,NULL,0); while(u&&trans[u][c]==0){ trans[u][c]=z; u=suflink[u]; } if(!u){ suflink[z]=1; return z; } int v=trans[u][c]; if(maxlen[v]==maxlen[u]+1){ suflink[z]=v; return z; } int y=New_state(maxlen[u]+1,trans[v],suflink[v]); suflink[v]=suflink[z]=y; while(u&&trans[u][c]==v){ trans[u][c]=y; u=suflink[u]; } return z;}void c_sort(int n,int lim){ memset(barrel,0,sizeof(barrel)); for(int i=1;i<=n;i++) barrel[maxlen[i]]++; for(int i=1;i<=lim;i++) barrel[i]+=barrel[i-1]; for(int i=1;i<=n;i++) ranks[barrel[maxlen[i]]--]=i; }int Ans[202000],mx[202000]; char s[202000];void init(void){ Nodecnt=1; memset(maxlen,0,sizeof(maxlen)); memset(trans,0,sizeof(trans)); memset(suflink,0,sizeof(suflink)); memset(ranks,0,sizeof(ranks)); memset(Ans,0,sizeof(Ans)); memset(mx,0,sizeof(mx));}int main(){ // freopen("test.in","r",stdin); int T; scanf("%d",&T); while(T--){ init(); int cnt=0,last=1,numx; Nodecnt=1; int len; scanf("%d",&numx); for(int i=1;i<=numx;i++){ scanf("%s",s+1); ++cnt; len=strlen(s+1); if(cnt==1){ for(int i=1;i<=len;i++) last=add_len(last,s[i]-'a'); c_sort(Nodecnt,200010); for(int i=1;i<=Nodecnt;i++) Ans[i]=maxlen[i]; } else{ memset(mx,0,sizeof(mx)); int nowp=1,lent=0; for(int i=1;i<=len;i++){ if(trans[nowp][s[i]-'a']){ lent++; nowp=trans[nowp][s[i]-'a']; } else{ while(nowp&&trans[nowp][s[i]-'a']==0) nowp=suflink[nowp]; if(!nowp){ nowp=1; lent=0; continue; } else{ lent=maxlen[nowp]+1; nowp=trans[nowp][s[i]-'a']; } } mx[nowp]=max(mx[nowp],lent); } for(int i=Nodecnt;i>=1;i--){ int t=ranks[i]; mx[suflink[t]]=max(mx[suflink[t]],mx[t]); } for(int i=1;i<=Nodecnt;i++) Ans[i]=min(Ans[i],mx[i]); } } int ans=0; for(int i=1;i<=Nodecnt;i++) ans=max(Ans[i],ans); printf("%d\n",ans); } return 0;}

转载于:https://www.cnblogs.com/dreagonm/p/10733719.html

你可能感兴趣的文章
php编译安装 GD库与mysqli 与curl
查看>>
sqlserver 2008 修改表结构不能保存
查看>>
Linux集群理论及技术
查看>>
ApFree线程池
查看>>
VMware 8.0下载地址
查看>>
Linux安装光盘修复GRUB
查看>>
字符串的包含
查看>>
分享代码
查看>>
二 IOC之注解的方式
查看>>
MySQL、oracle分页机制区别
查看>>
1.2 关键词所带来的差异
查看>>
操作系统中的《 IO - 同步,异步,阻塞,非阻塞 》(转载)
查看>>
centos 6.5 安装mysql5.6.10
查看>>
常用公共代码三对象的管理(仿Spring IOC和AOP)
查看>>
磁盘管理
查看>>
我的友情链接
查看>>
报错:R cannot be resolved to a variable
查看>>
Haproxy全透明代理的部署
查看>>
lock wait执行计划看索引的重要性
查看>>
【python】字符串、16进制等数据处理
查看>>