zoukankan      html  css  js  c++  java
  • Radio Transmission(Bzoj1355)

    试题描述
    给你一个字符串,它是由某个字符串不断自我连接形成的。但是这个字符串是不确定的,现在只想知道它的最短长度是多少。
    输入
    第一行给出字符串的长度 L(1≤L≤10^6),第二行给出一个字符串,全由小写字母组成。
    输出
    输出最短的长度。
    输入示例
    8
    cabcabca
    输出示例
    3
    其他说明
    样例说明
    对于样例,我们可以利用 abc 不断自我连接得到 abc,读入的 cabcabca 是它的子串。

    数据范围与提示
    对于全部数据,1≤L≤10^6 。

    看起来是没什么想法的,第一印象是写个hash然后作差(其实根本就不对)

    正解是kmp,而且只需要求出nxt数组就可以了(连模式串都没有)

    然后就是考思维的时候了,我们知道nxt数组存的是上一个转移到的地方,而最后一个就相当于是这个字符串的最长的相同的前缀和后缀

    因为这个串是由重复的字符串组成的,所以我们将循环节定为最后一个循环节(循环节有多种形式),因为kmp的nxt数组存的是不包括整个串的相同的串

    相当于是将最后一个不完整的循环节补全了,从上一个前缀的后缀处截取

    我们以样例为例:

    cabcabca      nxt[8]=5

    cabca    cabca

    相当于把末尾的ca在前缀中截取出来,所以直接做差

    得到式子  最短的循环节为   n-nxt[n]

    下面给出代码:

    #include<iostream>
    #include<cmath>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<queue>
    using namespace std;
    inline int min(int a,int b){return a<b?a:b;}
    inline int max(int a,int b){return a>b?a:b;}
    inline int rd()
    {
        int x=0,f=1;
        char c=getchar();
        for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
        for(;isdigit(c);c=getchar()) x=x*10+c-'0';
        return x*f;
    }
    inline void write(int x)
    {
         if(x<0) putchar('-'),x=-x;
         if(x>9) write(x/10);
         putchar(x%10+'0');
    }
    char a[1000005];
    int n;
    int p[1000005];
    void pre()
    {
        p[1]=0; 
        int j=0;
        for(int i=1;i<n;i++)
        {
            while(j>0&&a[i+1]!=a[j+1]) j=p[j];
            if(a[i+1]==a[j+1]) j++;
            p[i+1]=j;
        }
        return ;
    }
    int main()
    {
        n=rd();
        cin>>a+1;
        pre();
        printf("%d",n-p[n]);
        return 0;
    }
    蒟蒻总是更懂你✿✿ヽ(°▽°)ノ✿
  • 相关阅读:
    java注解
    Mac窗口管理管理软件SizeUp
    mac下8080端口到80端口的转发
    mac svn的替代品CornerStone
    模板模式讲解二
    数组和集合List的相互转化
    fastjson使用示例
    模板模式讲解一
    mybatis-generator-core自动生成do、mapping、dao 代码
    maven依赖传递关系
  • 原文地址:https://www.cnblogs.com/WWHHTT/p/9706517.html
Copyright © 2011-2022 走看看