[2016-02-04][HDU][3746][Cyclic Nacklace]

  • 时间:2016-02-04 00:14:53 星期四
  • 题目编号:HDU 3746
  • 题目大意:给出一个字符串,把字符串补成循环的字符串,至少需要多少补充多少字符,
  • 方法:kmp



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

#include <vector>

#include <list>

#include <map>

#include <set>

#include <deque>

#include <queue>

#include <stack>

#include <bitset>

#include <algorithm>

#include <functional>

#include <numeric>

#include <utility>

#include <sstream>

#include <iostream>

#include <iomanip>

#include <cstdio>

#include <cmath>

#include <cstdlib>

#include <cctype>

#include <string>

#include <cstring>

#include <cstdio>

#include <cmath>

#include <cstdlib>

#include <ctime>

using namespace std;

typedef long long LL;

#define CLR(x,y) memset((x),(y),sizeof((x)))

#define getint(x) scanf("%d",&(x))

#define get2int(x,y) scanf("%d%d",&(x),&(y))

#define get3int(x,y,z) scanf("%d%d%d",&(x),&(y),&(z))

#define getll(x) scanf("%I64d",&(x))

#define get2ll(x,y) scanf("%I64d%I64d",&(x),&(y))

#define get3ll(x,y,z) scanf("%I64d%I64d%I64d",&(x),&(y),&(z))

#define getdb(x) scanf("%f",&(x))

#define get2db(x,y) scanf("%f%f",&(x),&(y))

#define get3db(x,y,z) scanf("%f%f%f",&(x),&(y),&(z))

#define getstr(str) scanf("%s",str)

#define rep(x,y,z) for((x)=(y);(x)<(z);(x)++)

#define repd(x,y,z) for((x)=(y);(x)>=(z);(x)--)

const int maxm = 100000 + 10;

int nextt[maxm];

void makenext(char p[],int m)

{

    CLR(nextt,0);

    for(int i= 1,j = 0;i < m ;)

    {

        if(p[i] == p[j]) nextt[i++] = ++j;

        else if (j > 0) j = nextt[j-1];

        else i++;

    }

}

int main()

{

    int t;getint(t);

    char str[maxm];

    while(t--)

    {

        getstr(str);

        int len = strlen(str);

        makenext(str,len);

        int tmp = len - nextt[len - 1];

        int res;

        if(len % tmp || tmp == len) res = tmp - len % tmp;

        else res = 0;

        printf("%d\n",res);

    

    return 0;

}


来自为知笔记(Wiz)

时间: 2025-01-17 21:09:20

[2016-02-04][HDU][3746][Cyclic Nacklace]的相关文章

hdu 3746 Cyclic Nacklace (KMP求最小循环节)

//len-next[len]为最小循环节的长度 # include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int len; char a[100010]; int next[100010]; void Getnext() { int i=0,j=-1; next[0]=-1; while(i<=len) { if(j==-1||a[i]==a[j]) i

模板题 + KMP + 求最小循环节 --- HDU 3746 Cyclic Nacklace

Cyclic Nacklace Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3746 Mean: 给你一个字符串,让你在后面加尽量少的字符,使得这个字符串成为一个重复串. 例: abca---添加bc,成为abcabc abcd---添加abcd,成为abcdabcd aa---无需添加 analyse: 经典的求最小循环节. 首先给出结论:一个字符串的最小循环节为:len-next[len]. 证明: 举个例子:abcab

(KMP 1.4)hdu 3746 Cyclic Nacklace(使用next数组来求循环节的长度——求一个字符串需要添加多少个字符才能使该字符串的循环节的个数&gt;=2)

题目: Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3387    Accepted Submission(s): 1549 Problem Description CC always becomes very depressed at the end of this month, he has che

HDU 3746 Cyclic Nacklace (KMP 循环节)

分析:对next数组的深入理解,最重要的还是对最小循环节的处理. #include <stdio.h> #include <string.h> int next[100005]; char str2[100005]; void build_next(int len2) { int i=0,j=-1; next[0] = -1; while (i < len2) { if (j==-1 || str2[i] == str2[j]) { i++; j++; // if (str2

hdu 3746 Cyclic Nacklace KMP循环节问题

Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4124    Accepted Submission(s): 1866 Problem Description CC always becomes very depressed at the end of this month, he has checke

HDU 3746 Cyclic Nacklace (KMP最小循环节)

Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11264    Accepted Submission(s): 4821 Problem Description CC always becomes very depressed at the end of this month, he has check

HDU 3746 Cyclic Nacklace (KMP找循环节)

题目链接:HDU 3746 Sample Input 3 aaa abca abcde Sample Output 0 2 5 Author possessor WC Source HDU 3rd "Vegetable-Birds Cup" Programming Open Contest Solution 题意 给定一个字符串,问至少需要在末尾添加多少个字符使得字符串循环. 思路 KMP 设前缀函数为 \(\pi()\),字符串长度为 \(n\),下标从 \(1\) 开始. 最小循环

hdu 3746 Cyclic Nacklace KMP

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3746 题目: Problem Description CC always becomes very depressed at the end of this month, he has checked his credit card yesterday, without any surprise, there are only 99.9 yuan left. he is too distressed

HDU 3746 Cyclic Nacklace(KMP求循环节)

Description CC always becomes very depressed at the end of this month, he has checked his credit card yesterday, without any surprise, there are only 99.9 yuan left. he is too distressed and thinking about how to tide over the last days. Being inspir