[hdu4333]Revolving Digits
2018-06-17 22:30:50来源:未知 阅读 ()
/*注意注意:本题非hdu4333原题,而是简化版,原版有多组数据。但此代码在修改输入后依旧可以通过多组数据*/
给出一个数字串,问有多少本质不同同构串比原串小,一样,大.
同构串是指,对于原串S[1-N]通过旋转变成同构串S[i-N]+S[0-i-1].
本质不同,指的是字符串不一样.
输入格式:
一行一个数字串输出格式:
一行,输出本质不同的同构串比原串小,一样,大的三个数,用一个空格分隔开。样例输入:
123123
样例输出:
0 1 2
数据范围:
数字串长度<=100000#include<cstdio> #include<cstring> using namespace std; char s1[1000100],s2[1000100]; int ex[1000100],nxt[1000100],nex[1000100]; void get(char *s2){ int m=strlen(s2); nex[0]=nex[1]=0;int j=0; for(int i=1;i<m;i++){ while(j>0&&s2[i]!=s2[j])j=nex[j]; if(s2[i]==s2[j])j++; nex[i+1]=j; } } void getex(char *s2){ int j=0,n=strlen(s2); while(j+1<n&&s2[j+1]==s2[j])j++; nxt[0]=n;nxt[1]=j;int po=1,p=nxt[1]+1; for(int i=2;i<n;i++){ int len=nxt[i-po]; if(len+i<p)nxt[i]=len; else{ int j=p-i; if(j<0)j=0; while(i+j<n&&s2[j]==s2[j+i])j++; nxt[i]=j; po=i; p=nxt[po]+po; } } } void exkmp(char *s1,char *s2){ int j=0,n=strlen(s1),m=strlen(s2); while(s1[j]==s2[j]&&j<n&&j<m)j++; ex[0]=j;int po=0,p=ex[0]; for(int i=1;i<n;i++){ int len=nxt[i-po]; if(len+i<p)ex[i]=len; else{ int j=p-i; while(i+j<n&&j<m&&s1[j+i]==s2[j])j++; ex[i]=j; po=i; p=ex[po]+po; } } } int main(){ scanf("%s",s2);int len=strlen(s2); for(int i=0;i<len;i++) s1[i]=s2[i],s1[i+len]=s2[i]; getex(s2); exkmp(s1,s2); get(s2); int temp=len%(len-nex[len])==0?len/(len-nex[len]):1; int a=0,b=0,c=0; for(int i=0;i<len;i++){ if(ex[i]>=len)b++; else if(s1[i+ex[i]]<s2[ex[i]])a++; else c++; } printf("%d %d %d",a/temp,b/temp,c/temp); }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash