本文主要是介绍xdoj 1012,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
转自我们班大佬的
#include<cstdio>
#include<cstring>
using namespace std;
char s[400005];
int next[400005];
void get_next(int len)
{next[0]=-1;int j=-1;int i=0;while(i<len){if(j==-1||s[len-i-1]==s[len-j-1]) next[++i]= ++j;else j=next[j];}
}
int main()
{int len;while(~scanf("%s",s)){len=strlen(s);get_next(len);int maxcnt=0;int maxl=0;for(int i=1;i<=len;i++){int l=i-next[i];if(l&&i%l==0){int cnt=i/l;if(cnt>=maxcnt){maxcnt=cnt;maxl=l; }}}if(maxcnt>1){for(int i=len-maxl;i<len;i++) printf("%c",s[i]);printf(" %d\n",maxcnt);}else printf("-1\n");}}
1012: 重复序列
时间限制: 1 Sec 内存限制: 128 MB提交: 238 解决: 41
[ 提交][ 状态][ 讨论版]
题目描述
为了让密码变得更长,fpcsong在密码的末端增加了一些无意义内容。为了能够记住密码,增加的内容往往是重复序列。例如下列密码
xduacm2015_mimayaochangchangchang
的末端有一重复序列,即"chang"重复3次。现在,给你一个串s,请你确定一个串p和数x,使得p非空,x>1,px(指串p重复x次)为s的后缀。若有多个可能的解,输出x最大的解。若仍有多解,输出|p|(p的长度)最大的解。若无解,输出-1。
输入
多组数据,每组数据1行,包含一个串s。s中只有字母(大小写敏感),数字,下划线。|s|<=400000。
输出
对于每组数据,输出1行,若有解输出串p和整数x,用空格分割。若无解输出-1。
样例输入
xduacm2015_mimayaochangchangchang
orzorzorzorz
Orzorzorzorz
orzorz_diaodiaodiaodiao
we_orz_tencent_light_light
ooooooooooops
样例输出
chang 3
orz 4
orz 3
diao 4
_light 2
-1
提示
来源
这篇关于xdoj 1012的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!