• 【bzoj1335】Radio Transmission


    给你一个字符串,它是由某个字符串不断自我连接形成的。
    但是这个字符串是不确定的,现在只想知道它的最短长度是多少.

    因为这个字符串是不断自匹配形成的我们可以很容易的想到,除了第一个字符串外,从第二个字符串开始,根据这样一个过程:
    cabcabca
    i=1 0 j=1
    i=2 0
    i=3 0
    i=4 1
    i=5 -> j=4 -> 2
    i=6 3
    i=7 4
    i=8 -> j=7 -> 5
    也就是说,除了第一个字符串外
    剩下的都可以通过next数组的辅助平移是匹配进行下去
    这样就是说在next数组中,除了第一个字符串外,剩下的存储在next数组中的数是从1开始逐个递增的,这样就是说,最后我们用组合字符串长度n减去next[n]就能得到最小循环元的长度

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 1000086;
     4 int n;
     5 char a[maxn];
     6 int Next[maxn];
     7 
     8 inline int read() {
     9     int x = 0, y = 1;
    10     char ch = getchar();
    11     while(!isdigit(ch)) {
    12         if(ch == '-') y = -1;
    13         ch = getchar();
    14     }
    15     while(isdigit(ch)) {
    16         x = (x << 1) + (x << 3) + ch - '0';
    17         ch = getchar();
    18     }
    19     return x * y;
    20 }
    21 
    22 int main() {
    23     n = read();
    24     cin >> a + 1;
    25     Next[1] = 0;
    26     for(int i = 2, j = 0; i <= n; ++i) {
    27         while(j > 0 && a[i] != a[j + 1]) j = Next[j];
    28         if(a[i] == a[j + 1]) j++;
    29         Next[i] = j;
    30     }
    31     cout << n - Next[n] << '
    ';
    32     return 0;
    33 } 
    View Code
  • 相关阅读:
    Java学习之Jdk配置
    Socket网络模型之Select模型
    c#之初见反射
    c++读取文件夹中的文件
    C#泛型的初步理解
    C#接口简单介绍
    c#类,属性,方法和对象基本介绍
    事件的基本认识
    委托的基本认识
    在Xshell中使用rz命令上传文件出现乱码且文件无法删除的解决办法
  • 原文地址:https://www.cnblogs.com/ywjblog/p/9275206.html
Copyright © 2020-2023  润新知