zoukankan      html  css  js  c++  java
  • HUST 1010 The Minimum Length (字符串最小循环节)

    题意

    有一个字符串A,一次次的重写A,会得到一个新的字符串AAAAAAAA.....,现在将这个字符串从中切去一部分得到一个字符串B。例如有一个字符串A="abcdefg".,复制几次之后得到abcdefgabcdefgabcdefgabcdefg....,现在切去中间红色的部分,得到字符串B,现在只给出字符串B,求出字符串A的最小长度。

    思路

    容易发现这个“循环节”是可以“旋转”的。即上述的"abcdefg"也可以是"bcdefga","cdefgab",…… 。所以我们完全可以规定这个循环节是以字符串B的后缀为后缀的字符串。next[]数组表示满足S[1..i’] == S[i-i’+1..i]的最大的i’。则S[next[n]+1..n]就是答案,长度就为n-next[n]

    代码

      [cpp] #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <string> #include <cstring> #include <vector> #include <set> #include <stack> #include <queue> #define MID(x,y) ((x+y)/2) #define MEM(a,b) memset(a,b,sizeof(a)) #define REP(i, begin, end) for (int i = begin; i <= end; i ++) using namespace std; const int maxn = 1000005; int next[maxn]; char s[maxn]; void get_next(){ int len = strlen(s), j = -1; next[0] = -1; for (int i = 1; i < len; i ++){ while(j > -1 && s[i] != s[j+1]) j = next[j]; if (s[i] == s[j+1]) j ++; next[i] = j; } } int main(){ while(scanf("%s", s) != EOF){ get_next(); printf("%d ", strlen(s) - (next[strlen(s)-1] + 1)); } return 0; } [/cpp]

  • 相关阅读:
    洛谷P3376 【模板】网络最大流
    bzoj 4598: [Sdoi2016]模式字符串
    JAVA类(下)
    2019DDCTF部分Writeup
    Atom配置(VIM党) · iuunhao
    Tips
    rsync auth failed on module xxx
    基于mykernel完成时间片轮询多道进程的简单内核
    机器学习技法笔记(2)-Linear SVM
    css之制作三角形
  • 原文地址:https://www.cnblogs.com/AbandonZHANG/p/4114114.html
Copyright © 2011-2022 走看看