hdu 3374 String Problem kmp+字符串最小表示法+next数组性质
2015-10-16 15:50
435 查看
[code]#include<bits/stdc++.h> using namespace std; char s[2000000+10],st[1000000+10]; int f[1000000+10]; void getfail(char *p) { int m=strlen(p); f[0]=0; f[1]=0; for(int i=1;i<m;i++) { int j=f[i]; while(j&&p[j]!=p[i]) j=f[j]; f[i+1]=p[i]==p[j]?j+1:0; } } int Min(char *s,int l) { int i,j,k; i=0; j=1; k=0; while(i<l&&j<l) { k=0; while(s[i+k]==s[j+k]&&k<l) k++; if(k==l) return min(i,j); if(s[i+k]>s[j+k]) if(i+k+1>j) i=i+k+1; else i=j+1; else if(j+k+1>i) j=j+k+1; else j=i+1; } if(i<l) return i; else return j; } int Max(char *s,int l) { int i,j,k; i=0; j=1; k=0; while(i<l&&j<l) { k=0; while(s[i+k]==s[j+k]&&k<l) k++; if(k==l) return min(i,j); if(s[i+k]<s[j+k]) if(i+k+1>j) i=i+k+1; else i=j+1; else if(j+k+1>i) j=j+k+1; else j=i+1; } if(j<l) return j; else return i; } int main() { int i,j,len,ans1,ans2,cnt; while(~scanf("%s",st)) { len=strlen(st); strcpy(s,st); strcat(s,st); cnt=1; getfail(st); if(len%(len-f[len])==0) cnt=len/(len-f[len]); printf("%d %d %d %d\n",Min(s,len)+1,cnt,Max(s,len)+1,cnt); } return 0; }
相关文章推荐
- ApplicationContext和BeanFactory的不同之处
- 奶牛问题3:奶牛派对
- armeabi-v7a armeabi arm64-v8a
- Xcode 7 添加新设备
- CAKeyframeAnimation
- Junipor交换机 ssh_exchange_identification: Connection closed by remote host
- 内部存储空间 手机存储空间 sd卡
- 什么样的loading动画,我会等!
- AudioRecord的raw转8位wav或mp3
- 打开系统的图库,返回图片并处理图片以防止内存溢出。
- ArrayList与LinkedList区别(转)
- OSG 碰撞检测之多面体求交器代码解读(PloytopeIntersector)
- iOS 3D Touch (UIApplicationShortcutItem、UIViewControllerPreviewing、UIPreviewAction)
- Linux chmod命令详解
- win10系统如何快速切换桌面 两种方法快速切换win10桌面快捷键
- 两数二进制bit位不同个数
- MyEclipse快捷键大全
- checkpoint性能测试
- Windows与Linux下Base64编码问题
- Docker使用心得