您的位置:首页 > 其它

【扩展kmp+最小循环节】HDU 4333 Revolving Digits

2017-08-20 13:37 351 查看
http://acm.hdu.edu.cn/showproblem.php?pid=4333

【题意】

给定一个数字<=10^100000,每次将该数的第一位放到放到最后一位,求所有组成的不同的数比原数小的个数,相等的个数,大的个数

【思路】

这个数很大,用字符串处理

比较两个字符串的大小,一位一位很耗时,可以求出最长公共前缀,只比较最长公共前缀后一位

每次将数的最后一位放到最后一位,如abcd变成dabc,cdab,bcda,相当于abcdabcd各个后缀的前四位

这样就变成了求abcdabcd的每个后缀与abcd的最长公共前缀,用扩展KMP线性求

abab这种情况按上面的做法abababab会考察ab,ba,ab,ba,有重复的,是因为abab=(ab)^2,所以还要考虑最小循环节去重

【AC】

扩展kmp计算最小循环节方法二:利用已知的next数组
【知识点】

扩展kmp的next数组与kmp数组的next含义不同,是字符串s的所有后缀和s本身的最长公共前缀

【坑点】

做这道题踩了各种坑

strcat函数的用法:strcat(s,s)是错误的,会T,strcat的两个参数传的是指针,就是s在内存里面的位置,这里两个s是同一个东西第一个s变长的时候,第二个s也会变长,然后就没完没了了


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: