HDU 3746利用KMP找循环节
2013-11-01 20:06
489 查看
题意大致是问给一个序列后面补充几个元素使其恰能成为几个重复循环的序列。
aaa最小循环节是1,3个循环所以补充0个元素,abca循环节是3,应补充2个元素,abcde则循环节为5,补充5个元素,至于循环节的求法,是向wuyiqi巨巨学习的,膜拜下。。
/article/2711374.html
* This source code was highlighted byYcdoiT. ( style:
Borland )
aaa最小循环节是1,3个循环所以补充0个元素,abca循环节是3,应补充2个元素,abcde则循环节为5,补充5个元素,至于循环节的求法,是向wuyiqi巨巨学习的,膜拜下。。
/article/2711374.html
/********************** * author:crazy_石头 * Pro:HDOJ 3746-Cyclic Nacklace * algorithm: KMP * Judge Status:Accepted * Memory:728K * Time:125ms * date:2013/11/01 ***********************/ #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> using namespace std; #define rep(i,h,n) for(int i=(h);i<=(n);i++) const int maxn=200000+5; int next[maxn]; char p[maxn]; int n,test;//主串的串长; inline void getNext(char *p,int *next) { int i,j; i=0,j=-1; next[0]=-1; int m=strlen(p); while(i<m) { if(j==-1||p[i]==p[j]) i++,j++,next[i]=j; else j=next[j]; } } int main() { scanf("%d",&test); while(test--) { scanf("%s",p); getNext(p,next); int len=strlen(p); int res=len-next[len];//最小循环节的值res=len-next[len]; if(len%res==0&&res!=len) printf("%d\n",0);//凑够了几个循环则不必再补元素,输出0; else printf("%d\n",res-len%res);//不能整除的时候补res-len%res个元素; } return 0; } |
Borland )
相关文章推荐
- 本博客目的
- c#剪切板操作
- American Heritage
- linux shell 相对路径转化为绝对路径
- uboot对linux的引导
- 图文详解YUV420数据格式
- Linux终端中的各种指令
- 游戏嵌入 文字广告"欢迎使用**组系列游戏,**组网站致力打造国内最大最全资源分享平台!"
- SQLite教程
- Cocos2d-x 进度加载
- Oracle数据类型与.NET中的对应关系
- 贪财的富翁
- SQLite教程
- 单向链表的反转
- 八皇后问题 EightQueen
- OPENFIRE+MYSQL5.6安装中遇见Specified key was too long; max key length is 767 bytes openfire处理办法
- 驴生态度,很值得我们学习
- 输出第i层上所有顶点的数据
- OPENGL|ES第三天,Compiling Shaders and Drawing to the Screen
- 一个2013届毕业生(踏上IT行业)的迷茫(3)