【hdu4333】扩展kmp算法
2015-08-24 18:47
435 查看
原题链接
思路比较简单。把原串扩大一倍,然后以原串为模板串,用扩展kmp算法求出每个位置的最大前缀即可。(WA了一天了,也不知道改了哪个地方就对了…………)
思路比较简单。把原串扩大一倍,然后以原串为模板串,用扩展kmp算法求出每个位置的最大前缀即可。(WA了一天了,也不知道改了哪个地方就对了…………)
[code]#include<iostream> #include<cstdio> #define maxl 1000100 using namespace std; char s1[maxl*2],s2[maxl*2]; int len,pre[maxl],temp; void getpre(char*s){ pre[1]=pre[0]=0; for(int i=1;i<len;i++){ int j=pre[i]; while(j&&s[i]!=s[j])j=pre[j]; pre[i+1]=s[i]==s[j]?j+1:0; } temp=len%(len-pre[len])==0?len/(len-pre[len]):1; s[len]='\0'; } void getst(){ len=0; for(char c=getchar();c!='\n'&&c!=' '&&c!=EOF;c=getchar()){ s2[len]=s1[len]=c; len++; } getpre(s1); for(int i=len;i<2*len;i++)s2[i]=s1[i-len]; s2[2*len]='\0'; } int f[maxl]; void getf(char*s,int*f){ f[0]=len,f[1]=len-1; for(int i=0;i<len;i++)if(s[i]!=s[i+1]){f[1]=i;break;} int k=1; for(int i=2;i<=len;i++){ int p=k+f[k]-1,l=f[i-k]; if(i+l<=p)f[i]=l;else{ int j=max(0,p-i+1); while(i+j<len&&s[i+j]==s[j])j++; f[i]=j; k=i; } } } int ex[maxl]; void exkmp(char*T,char*P){ getf(P,f); ex[0]=ex[1]=len; for(int i=0;i<len;i++)if(P[i]!=T[i+1]){ex[1]=i;break;} int k=1; for(int i=2;i<len;i++){ int p=k+ex[k]-1,l=f[i-k]; if(i+l<=p)ex[i]=l;else{ int j=max(0,p-i+1); while(i+j<2*len&&T[i+j]==P[j])j++; ex[i]=j;k=i; } } } int main(){ freopen("4333.in","r",stdin); freopen("wode.out","w",stdout); int T; scanf("%d",&T); getchar(); for(int j=1;j<=T;j++){ getst(); exkmp(s2,s1); int c1=0,c2=0,c3=0; for(int i=0;i<len;i++)if(ex[i]>=len)c1++; else if(s2[i+ex[i]]<s1[ex[i]])c2++; else c3++; printf("Case %d: %d %d %d\n",j,c2/temp,c1/temp,c3/temp); } return 0; }
相关文章推荐
- jmap-permstat-takes-long-time-and-hangs
- STL学习----入门(1)[utility]
- poj 2195 最小费用最大流
- POJ 3468 A Simple Problem with Integers
- Emacs Buffer workflow for Alfred2
- Topcoder SRM 660 DIV1 500 Privateparty(数学,容斥)
- 【最短路建模】【d[u] <= d[v] + g[v][u] v--->u】【差分系统】
- Calendar--Java快速获取昨天日期
- Nuget安装更新包到指定版本
- 编写高质量代码改善C#程序的157个建议——建议156:利用特性为应用程序提供多个版本
- 【数据库】主键、外键、索引
- Hadoop2 namenode 联邦 实验
- CDH集群调优:内存、Vcores和DRF
- 网络爬虫:采用“负载均衡”策略来优化网络爬虫
- 网络爬虫:采用“负载均衡”策略来优化网络爬虫
- 大数据技术就在生活中: 登机牌、阅卷与 Map-Reduce(归约)
- 笔画
- STL学习----入门(1)[stack]
- UIAlert的使用
- Asp.Net中的三种分页方式