HDU4333
2015-08-24 16:33
204 查看
传送门:HDU4333
扩展KMP小应用,把原串复制一遍就行了。
对着某位博主的代码,死活改不出来,然后发现这货的代码是WA的……
代码上的`小细节见下。
扩展KMP小应用,把原串复制一遍就行了。
对着某位博主的代码,死活改不出来,然后发现这货的代码是WA的……
代码上的`小细节见下。
[code]#include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <algorithm> #include <iostream> using namespace std; int ext[2000005]; int pre[2000005]; char S[2000005]; int n,length; void Build_ext(const char *T,int* ext){ int len=strlen(T),a=0,p=0; ext[0]=len; while(p<len-1&&T[p]==T[p+1]) p++; ext[1]=p; a=1; for(int k=2;k<len;k++){ if(ext[k-a]+k-1>=p){ int j =max((p-k+1),0); while(k+j<len&&T[k+j]==T[j]) j++; ext[k]=j; a=k; p=k+j-1; } else ext[k]=ext[k-a]; } } void KMP(char* S,int len) { pre[0]=-1;int k=-1; for(int i=1;i<len;i++){ while(k>=0&&S[k+1]!=S[i]) k=pre[k]; if(S[k+1]==S[i]) k++; pre[i]=k; } } void GetAns(int number) { Build_ext(S,ext); int ans1=0,ans2=0,ans3=0; for(int i=1;i<=length;i++) if(ext[i]>=length) ans2++; else if(S[i+ext[i]]>S[ext[i]]) ans3++; else ans1++; KMP(S,strlen(S)); int tmp=length%(length-pre[length])==0?max(length/(length-pre[length]),1):1; printf("Case %d: %d %d %d\n",number,ans1/tmp,ans2/tmp,ans3/tmp); } void Readdata() { freopen("loli.in","r",stdin); ios::sync_with_stdio(false); cin>>n; } void Solve() { for(int i=1;i<=n;i++){ cin>>S; length=strlen(S); for(int j=0;j<length;j++) S[j+length]=S[j]; S[2*length]='\0'; GetAns(i); } } void Close() { fclose(stdin); fclose(stdout); } int main() { Readdata(); Solve(); Close(); return 0; }
相关文章推荐
- git及svn操作备忘
- 2015大型互联网公司也开始招收学校,你准备好要付出的东西?
- 附加数据库后无法创建发布,error 2812 解决
- PAT 1072. Gas Station (30)
- 微信支付中的jsapi返回提示信息
- Activity随手势滑动退出,及模糊Dialog(类似于IOS的效果)
- 数据库SQL Server2012笔记(二)——表的管理
- 机器 学习入门 知识
- poj 2418 字典树 Map容器
- 离开单位后社保会被冻结吗?
- Android ----waiting for debugger .
- 信号量CSemaphore的使用
- 黑马程序员_面向对象之继承
- Android线程和线程Handler基础一览
- Spring MVC BeanNameUrlHandlerMapping example
- 基于jquery实现在线选座订座之影院篇
- js淡入淡出的图片轮播效果代码分享
- Qt中如何利用QPushButton来实现一个弹出菜单
- 使用sbt构建scala应用
- SQLite学习笔记(9)-SQLite的简单使用