Cyclic Nacklace HDU

来源:互联网 发布:python 键盘输入 超时 编辑:程序博客网 时间:2024/06/05 07:16

题目传送门

题意:给你个字符串,问你最少添加几个字符可以让这个字符串至少循环两次。

思路:直接找最小覆盖子串,然后特判一下就可以了。

#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <list>#include <map>#include <queue>#include <set>#include <stack>#include <string>#include <vector>#define MAXN 100010#define MAXE 100#define INF 1000000000#define MOD 10001#define LL long long#define ULL unsigned long long#define pi 3.14159using namespace std;int nex[MAXN];string str;void get_nex() {    memset(nex, 0, sizeof(nex));    for (int i = 1, j = 0; i < str.length(); ++i) {        while (j && str[i] != str[j]) {            j = nex[j];        }        if (str[i] == str[j]) {            j++;        }        nex[i + 1] = j;    }}int main() {    std::ios::sync_with_stdio(false);    int T;    cin >> T;    for (int kase = 1; kase <= T; ++kase) {        cin >> str;        get_nex();        int n = (int) str.length();        if (nex[n] == 0) {            cout << n << endl;        } else {            int m = 0;            if (n % (n - nex[n]) == 0) {                m = n - nex[n];            } else {                m = n % (n - nex[n]);            }            cout << n - nex[n] - m << endl;        }    }    return 0;}
原创粉丝点击