Cyclic Nacklace(KMP之找寻环节)

本文介绍了一种名为Cyclic Necklace的问题解决方法,该问题旨在通过添加最少数量的字符使给定字符串变成由多个循环节组成的字符串。文章详细阐述了解决方案的思路与实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Cyclic Nacklace

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10306    Accepted Submission(s): 4412


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 and thinking about how to tide over the last days. Being inspired by the entrepreneurial spirit of "HDU CakeMan", he wants to sell some little things to make money. Of course, this is not an easy task.

As Christmas is around the corner, Boys are busy in choosing christmas presents to send to their girlfriends. It is believed that chain bracelet is a good choice. However, Things are not always so simple, as is known to everyone, girl's fond of the colorful decoration to make bracelet appears vivid and lively, meanwhile they want to display their mature side as college students. after CC understands the girls demands, he intends to sell the chain bracelet called CharmBracelet. The CharmBracelet is made up with colorful pearls to show girls' lively, and the most important thing is that it must be connected by a cyclic chain which means the color of pearls are cyclic connected from the left to right. And the cyclic count must be more than one. If you connect the leftmost pearl and the rightmost pearl of such chain, you can make a CharmBracelet. Just like the pictrue below, this CharmBracelet's cycle is 9 and its cyclic count is 2:

Now CC has brought in some ordinary bracelet chains, he wants to buy minimum number of pearls to make CharmBracelets so that he can save more money. but when remaking the bracelet, he can only add color pearls to the left end and right end of the chain, that is to say, adding to the middle is forbidden.
CC is satisfied with his ideas and ask you for help.
 

Input
The first line of the input is a single integer T ( 0 < T <= 100 ) which means the number of test cases.
Each test case contains only one line describe the original ordinary chain to be remade. Each character in the string stands for one pearl and there are 26 kinds of pearls being described by 'a' ~'z' characters. The length of the string Len: ( 3 <= Len <= 100000 ).
 

Output
For each case, you are required to output the minimum count of pearls added to make a CharmBracelet.
 

Sample Input
3 aaa abca abcde
 

Sample Output
0 2 5

题意:题目要求的是给定一个字符串,问我们还需要添加几个字符可以构成一个由 若干个循环节 组成的字符串。巧妙利用next[]数组即可

心得:next数组表示的是一个字符串前缀和后缀最大的公共长度,比如字符串s=  abcabca  这个字符串 ,其next[0]=-1,next[1]=0,next[2]=0,next[3]=0,next[4]=1,

next[5]=2,next[6]=3,next[7]=4,我们发现next[0]=-1,可是长度是不会为负数的,所以next[0]不用来表示s[0],而是用next[1]来表示s[0],那next[2]自然而然就是表示s[1]的,以此类推......所以这里求next数组的那个while()循环是i<len,而不是i<len-1,这和求子串不一样,求子串的话随便哪个都行,求循环节的话必须用i<len,所以最好用i<len

#include <cstdio>
#include <cstring>
using namespace std;
char str[100005];
int next[100005];
void getnext(int len)
{
    int i = 0,k=-1;
    next[0] = -1;
    while(i<len)
    {
        if(k== -1 || str[i] == str[k])
        {
            i++;
            k++;
            next[i] = k;
        }
        else
            k = next[k];
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",str);
        memset(next,0,sizeof(next));
        int len = strlen(str);
        int ans;
        getnext(len);
//        for(int i=0;i<=len;i++)
//            printf("%c:%d\n",str[i],next[i]);
        ans = len - next[len];//ans就是循环节长度
        if(ans!=len && len%ans == 0)//如果循环节长度不等于字符串长度,并且字符串长度是循环节长度的倍数,就不用添加了
            printf("0\n");
        else
           printf("%d\n",ans-next[len]%ans);//最后少了几个字符就添加几个
    }
    return 0;
}


内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值