ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

POJ1961 Period && POJ2604 Power Strings 字符串循环节

2019-06-27 19:38:32  阅读:206  来源: 互联网

标签:Power POJ2604 Fread namespace Period long char include define


两道题都是求循环节的。。。但是一道是学哈希时做的,另一道是学$KMP$时做的


POJ2604 用的哈希。。。枚举长度的因数作为循环节的长度,然后暴力算出所有循环节位置的哈希值,看看是否相等。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll unsigned long long
#define R register int
using namespace std;
namespace Fread {
    static char B[1<<15],*S=B,*D=B;
    #define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<15,stdin),S==D)?EOF:*S++)
    inline int g() {
        R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
        do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
    }
}using Fread::g;
const int B=131,N=1000010;
ll f[N],p[N];
inline ll calc(int l,int r) {return f[r]-f[l-1]*p[r-l+1];}
signed main() {
#ifdef JACK
    freopen("NOIPAK++.in","r",stdin);
#endif
    p[0]=1; for(R i=1;i<=N-10;++i) p[i]=p[i-1]*B;
    while(1) { register char s[N]; 
        scanf("%s",s+1); R n=strlen(s+1); 
        if(n==1&&s[1]=='.') break;
        for(R i=1;i<=n;++i) f[i]=f[i-1]*B+s[i]-96;
        for(R i=1;i<=n;++i) if(n%i==0) { register ll tmp=calc(1,i); 
            register bool flg=false; 
            for(R l=i+1;l<=n;l+=i) { 
                if(tmp!=calc(l,l+i-1)) {flg=1; break;}
            } if(!flg) {printf("%d\n",n/i);break;}
        } 
    }
}

POJ1961 用的$kmp$详解

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ull unsigned long long
#define ll long long
#define R register int
using namespace std;
namespace Fread {
    static char B[1<<15],*S=B,*D=B;
    #define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<15,stdin),S==D)?EOF:*S++)
    inline int g() {
        R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
        do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
    } inline bool isempty(const char& ch) {return ch<=36||ch>=127;}
    inline void gs(char* s) {register char ch; while(isempty(ch=getchar())); do *s++=ch; while(!isempty(ch=getchar()));}
}using Fread::g; using Fread::gs;
const int N=1000010;
char s[N]; int nxt[N],n,t;
inline void PRE() { nxt[1]=0;
    for(R i=2,j=0;i<=n;++i) {
        while(j&&s[i]!=s[j+1]) j=nxt[j];
        if(s[i]==s[j+1]) ++j; nxt[i]=j;
    }
}
signed main() {
#ifdef JACK
    freopen("NOIPAK++.in","r",stdin);
#endif
    while(n=g(),n>0) {
        gs(s+1); PRE(); printf("Test case #%d\n",++t);
        for(R i=2;i<=n;++i) {
            if(i%(i-nxt[i])==0&&i/(i-nxt[i])>1)
                printf("%d %d\n",i,i/(i-nxt[i]));
        } printf("\n");
    }
}

2019.06.27

 

标签:Power,POJ2604,Fread,namespace,Period,long,char,include,define
来源: https://www.cnblogs.com/Jackpei/p/11020500.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有