HDU 3746 Cyclic Nacklace (next数组的应用)

来源:互联网 发布:linux ssh配置 编辑:程序博客网 时间:2024/06/05 11:04

题目大意:

给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数。

例子:

abcabc 已经循环2次,添加数为0

abcac 没有循环2次,添加字符abcac。数目为5.

abcabcab 已经循环过2次,但第三次不完整,需要添加数为1

有这么个结论:len-next【len】等于循环节长度,嗯,很关键


解题思路:

next[]数组的运用。

#include <cstdio>#include <iostream>#include <cstring>#include <string>#include <cstdlib>#include <algorithm>#include <cmath>#include <vector>#include <set>#include <list>#include <queue>#include <map>#include <stack>using namespace std;#define L(i) i<<1#define R(i) i<<1|1#define INF  0x3f3f3f3f#define pi acos(-1.0)#define eps 1e-3#define maxn 1000010#define MOD 100000000int len;int Next[100010];char s[100010];void get_next(){    int i = 0, j = -1;    Next[0] = -1;    while(i < len)    {        if(j == -1 || s[i] == s[j])            Next[++i] = ++j;        else            j = Next[j];    }}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%s",s);        len = strlen(s);        get_next();//        for(int i = 0; i <= len; i++)//            printf("%d\n",Next[i]);        int k  = len - Next[len];        if(len != k && len % k == 0) //循环多次            printf("0\n");        else        {            int add = k - Next[len] % k; //取余的作用:abcab,去掉abc            printf("%d\n",add);        }    }    return 0;}


0 0
原创粉丝点击