zoukankan      html  css  js  c++  java
  • [BZOJ]1511: [POI2006]OKR-Periods of Words

    题解:  对于每个前缀 对于每个位置一直next下去 找到第一个不满足的情况 然后用长度减去不满足的长度 即为每个位置的答案  具体看代码吧

    就是Next数组的应用吧

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <cmath>
    #include <set>
    #include <map>
    #define mp make_pair
    #define pb push_back
    #define pii pair<int,int>
    #define link(x) for(edge *j=h[x];j;j=j->next)
    #define inc(i,l,r) for(int i=l;i<=r;i++)
    #define dec(i,r,l) for(int i=r;i>=l;i--)
    const int MAXN=1e6+10;
    const double eps=1e-8;
    #define ll long long
    using namespace std;
    struct edge{int t,v;edge*next;}e[MAXN<<1],*h[MAXN],*o=e;
    void add(int x,int y,int vul){o->t=y;o->v=vul;o->next=h[x];h[x]=o++;}
    ll read(){
        ll x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
        return x*f;
    }
    
    int n;
    char str[MAXN];
    int nxt[MAXN];
    
    void get_nxt(){
        nxt[0]=-1;int i=0;int j=-1;
        while(i<n){
        if(j==-1||str[i]==str[j])nxt[++i]=++j;
        else j=nxt[j];
        }
    }
    
    int num[MAXN];
    
    int main(){
        n=read();
        scanf("%s",str);
        get_nxt();
        ll ans=0;
        for(int i=1;i<n;i++){
        int j=nxt[i+1];
        if(!j)num[i]=i;
        else num[i]=num[j-1];
        ans+=(i-num[i]);
        }
        printf("%lld
    ",ans);
    }
    

      

    1511: [POI2006]OKR-Periods of Words

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 576  Solved: 366
    [Submit][Status][Discuss]

    Description

    一个串是有限个小写字符的序列,特别的,一个空序列也可以是一个串. 一个串P是串A的前缀, 当且仅当存在串B, 使得 A = PB. 如果 P A 并且 P 不是一个空串,那么我们说 P 是A的一个proper前缀. 定义Q 是A的周期, 当且仅当Q是A的一个proper 前缀并且A是QQ的前缀(不一定要是proper前缀). 比如串 abab 和 ababab 都是串abababa的周期. 串A的最大周期就是它最长的一个周期或者是一个空串(当A没有周期的时候), 比如说, ababab的最大周期是abab. 串abc的最大周期是空串. 给出一个串,求出它所有前缀的最大周期长度之和.

    Input

    第一行一个整数 k ( 1 k 1 000 000) 表示串的长度. 接下来一行表示给出的串.

    Output

    输出一个整数表示它所有前缀的最大周期长度之和.

    Sample Input

    8
    babababa

    Sample Output

    24
  • 相关阅读:
    WF4.0 Beta1 自定义跟踪
    WF4.0 Beta1 流程设计器与Activity Designer
    新版本工作流平台的 (二) 权限算法(组织结构部分)
    WF4.0 Beta1 WorkflowInvoker
    WF4.0 基础篇 (十) Collection 集合操作
    WF4.0 基础篇 (十五) TransactionScope 事物容器
    WF4.0 基础篇 (六) 数据的传递 Arguments 参数
    WF4B1 的Procedural Activity 之InvokeMethod , InvokeMethod<T> 使用
    WF4.0 Beta1 异常处理
    WF4.0 Beta1 变量 Variables
  • 原文地址:https://www.cnblogs.com/wang9897/p/10344608.html
Copyright © 2011-2022 走看看