看完花名,滚来写总结了。( >﹏<。)~呜呜....
题目:HDU1358
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1358
大意:求字符串子串最大分割自我循环次数。(表达的不好)
解题: 第一念头想着用KMP两层循环切割字符串,第一层处理原串,第二层处理模式串。
代码:然后费了好大的劲写了出来,结果,结果超时了 (┬_┬),(喂,这是理所应当的吧)。
没办法只好搜答案,发现只要运用next数组就可以解决了 (* ̄▽ ̄)y !
同时发现了自己的一个误区,原本以为next数组的值小于等于 slen/2,但实际上只要小于 slen就可以了。
同时可以发现,当next[slen]>slen/2,前缀与后缀有重叠的部分,通过观察可以发现答案与其的关系,至于原理目前未想通,(´Д`)
- 原来单单用next数组就可以算出字符串的自我循环次数了。 (* ̄︶ ̄)y
- 以上
#include <algorithm>
using namespace std;
char s[1000000];
int nextp[1000000];
void getnextp(char p[], int nextp[])
{
int i = 0, j = -1, l = strlen(p);
nextp[0] = -1;
while(i<l)
{
if(j==-1||p[i]==p[j])
{
i++;
j++;
nextp[i] = j;
}
else
j = nextp[j];
}
}
int main()
{
int i, n,out = 0;
while (scanf("%d", &n),n)
{
getchar();
gets(s);
printf("Test case #%d\n", ++out);
getnextp(s,nextp);
for(i=2;i<=n;i++)
{
if(!(i%(i-nextp[i]))&&i/(i-nextp[i])!=1)
printf("%d %d\n", i, i/(i-nextp[i]));
}
printf("\n");
}
}