博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4333 Revolving Digits
阅读量:5074 次
发布时间:2019-06-12

本文共 971 字,大约阅读时间需要 3 分钟。

扩展KMP的应用

我们发现本题的关键在于如何高效的判断两个同构字符串的大小关系,想到如果能够预处理出每一个同构字符串与原字符串的最长公共前缀,那么直接比较它们不一样的部分就好,扩展KMP正好是用来处理这样的问题的,把原串copy一遍加在其后,在其上跑一遍exKMP的next数组,就预处理出了所有同构字符串与原串之间的最长公共前缀,然后扫一遍直接比较即可。

注意:题目中要求的是不同的数字,将所得的答案除以最小循环节即可

本题中我们学到了如何高效的比较同构字符串的大小,使用exKMP即可,本思想可和最小最大表示法一起考察

#include 
#include
#include
#include
#include
#include
using namespace std;const int MAXN=2e5+5;int n,nxt[MAXN];char s[MAXN];void getnxt(){ nxt[0]=-1; int len=strlen(s); int k=-1,j=0; while(j
=mx||i+nxt[i-id]>=mx) { if(i>=mx) mx=i; while(mx
>n; int cnt=0; while(n--){ scanf("%s",s); int len=strlen(s); getnxt(); int ans=len-nxt[len],tt; if(len%ans==0) tt=len/ans; else tt=1; for(int i=0;i
=len) num2++; else if(s[nxt[i]]>s[nxt[i]+i]) num1++; else num3++; } printf("Case %d: %d %d %d\n",++cnt,num1/tt,num2/tt,num3/tt); } fclose(stdin); return 0;}

转载于:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8001280.html

你可能感兴趣的文章