Revolving Digits HDU - 4333 (扩展KMP)
发布日期:2021-08-13 01:52:13 浏览次数:6 分类:技术文章

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

Revolving Digits

 

题意:给一串数字,每次可以把最后一个移到最前面形成一个新的数字,问所有的数字中有多少比原数大、小、相等。

原数字为s,长度为len,那么一共形成len数字。

令t=s+s(连接),接下来利用扩展KMP找到t[i]对应的extend[i],然后去和s分三种情况比较。

需要注意的是如果s串是一个循环的串,那么要减去重复的数字,这里用到可KMP,len-nex[len]是循环节的长度。

 

1 #include 
2 using namespace std; 3 const int maxn=200010; 4 char s[maxn],t[maxn]; 5 int nex[maxn],ex[maxn]; 6 int lens,lent; 7 int f[maxn]; 8 void getnex(char* t){ 9 nex[0]=lent;10 int a=0,p=0;11 for(int i=1;i
=p||i+nex[i-a]>=p){13 if(i>=p) p=i;14 while(p
=p||i+nex[i-a]>=p){28 if(i>=p) p=i;29 while(i
=lent) b++;63 else if(s[i+ex[i]]
t[ex[i]]) c++;65 }66 printf(" %d %d %d\n",a/temp,b/temp,c/temp);67 }68 }
View Code

 

转载于:https://www.cnblogs.com/yijiull/p/7407486.html

转载地址:https://blog.csdn.net/weixin_30672295/article/details/96207925 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:跨域(同源策略)
下一篇:hash

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月15日 11时27分24秒