您的位置:首页 > 其它

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

2016-03-28 16:39 393 查看
题目大意:

给你一个字符串,要求将字符串的全部字符最少循环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 100000000

int 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: