hdu3149 Cyclic Nacklace(kmp求最大循环节)-程序员宅基地

技术标签: 字符串  hdu3149 Cyclic Nacklace(kmp求最大循环节)  

Cyclic Nacklace

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

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

题目大意:
给你一串序列,你只能在尾部加字符,为使得这个序列形成一个环(说不清直接拿例子说吧),为了使abca序列成一个环你需要在后面添加字符bc,这样首尾相连且一致,又如abcde你需要在后面添加abcde才能形成一个环,题目问你为了构成一个环你最少需要添加几个字符。

思路:我们可以先用kmp中的方法构建next数组,next[i]的值就是循环串前缀与后缀串相同的最大个数(事实上最少添加个数只与next【尾】有关,因为中间的next值无论你多大只要你到了串尾,一旦不相等,就是要添加再再尾部添加一个一模一样的串),然后用总串长减去这个循环串中前后缀最大相同个数,能够得到一个不循环串的长度(例如:abcdefabcd,我们需要在后面加ef使他循环,为此我们需要它前面那个串的长度),得到这个长度后用它减去next[串尾]就是我们要的答案,因为next[串尾]存的是最大前后缀相同个数,也就是说abcdef-abcd=2就是答案因为只需添加ef就能构成循环串,但是如果只是用不循环串长-最大前后缀相同个数可能会出现负数的情况例如:abcabca,答案应该是2,但是因为它循环了两次导致3(abc)-4(abca)=-1,实际上应该是3(abc)-1(a)=2,这时我们可以用模运算解决循环节>1的情况,只需要用next[串尾]%不循环串的长度就能解决问题。

代码:

#include<string>
#include<vector>
#include<stdio.h>
#include<iostream>
using namespace std;

string t;
vector<int> getnext(string t){
    
    vector<int>next(t.size());
    for(int i=1,k=0;i<t.size();i++){
    
        while(k>0&&t[i]!=t[k]){
    
            k=next[k-1];
        }
        if(t[i]==t[k]){
    
            next[i]=++k;
        }else{
    
            next[i]=k;
        }
    }
    return next;
}
void kmp(string t){
    
    vector<int>next=getnext(t);
    int len=t.size()-next[t.size()-1];
    if(next[t.size()-1]==0)printf("%d\n",t.size());//没有前后缀相同的存在,只能再尾部加一条一模一样的字符串
    else{
    
    	if(t.size()%len==0)printf("0\n");//每个前后缀刚好构成循环节 
    	else{
    
    		printf("%d\n",len-(next[t.size()-1]%len));
		}
	}
}
int main(){
    
    int T;
    std::ios::sync_with_stdio(false);
    scanf("%d",&T);
    while(T--){
    
        cin>>t;
        kmp(t);
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43736492/article/details/102466832

智能推荐

用 Python 编写的 Python 解释器-程序员宅基地

文章浏览阅读865次。(点击上方公众号,可快速关注)翻译: qingyunha 英文:Allison Kapturhttp://qingyunha.github.io/taotao/All..._python里写一个解释器

go语言使用smtp发送邮件_go的quotedprintable-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏3次。在 go 语言里想要发送smtp邮件是非常容器的事情,官方自带 net/smtp 包可以使用,不过这里介绍的是另一个包:gomail ,不是因为别的,主要是上手简单。import ( "gopkg.in/gomail.v2")// 初始化m := gomail.NewMessage()// 发邮件的地址m.SetHeader("From", "[email protected]")..._go的quotedprintable

Fire Net HDU - 1045(二分图匹配)-程序员宅基地

文章浏览阅读143次。Problem DescriptionSuppose that we have a square city with straight streets. A map of a city is a square board with n rows and n columns, each representing a street or a piece of wall.A blockhouse i...

浅谈Windows下SVN在Android Studio中的配置、基本使用及解除关联_android studio 每个项目打开都需要配置svn-程序员宅基地

文章浏览阅读723次。在AndroidStudio中开发版本控制中,除了Git就是SVN,和Eclipse不同Android Studio没有提供单独的插件,只能和SVN客户端关联使用,和Eclipse安装有很大区别,下面介绍在AndroidStudio中SVN的配置和基本使用。如果已经搭建好了服务端,只是在日常工作中import和checkout代码,只需下载TortoiseSVN客户端 就行,完全可以跳过以_android studio 每个项目打开都需要配置svn

seata-server安装、运行(ubuntu)-程序员宅基地

文章浏览阅读1.6k次。seata-server为seata中的事务协调器。seata的wikihttps://github.com/seata/seata/wiki/Home_Chinese一、下载并安装wget -P /opt/downloads https://github.com/seata/seata/releases/download/v0.5.1/seata-server-0..._ubuntu 启动seata

docx转换html(mammoth)_mammoth.browser-程序员宅基地

文章浏览阅读1.1w次,点赞3次,收藏10次。使用mammoth.js将docx文件转换成html前言最近接到一个需求,要求是把docx文档转换成html,显示在页面上,翻了好多资料,尝试了iframe嵌套,但问题是会自动下载,也不会显示html。于是继续搜索,找到了mammoth,一个将docx文件转换成html的东西,最后完美的解决了问题,下面谈谈使用心得吧!实现步骤1 首先将源代码下载了到本地,传送门:http://www.gi..._mammoth.browser

随便推点

客户端服务端之正向代理和反向代理的区别-程序员宅基地

文章浏览阅读429次。1. 正向代理从整个程序的层面,VPN代理了客户端的请求,去访问服务器,为正向。2. 反向代理反之,VPN代理了服务器接收客户端的请求,为反向。...

反转链表CPP_反转链表栈-程序员宅基地

文章浏览阅读300次。反转链表_反转链表栈

企业IT故障应急响应:四大关键控制点的精细管理_itil 应急响应-程序员宅基地

文章浏览阅读1.9k次,点赞37次,收藏40次。面对不断复杂的生产环境,如何围绕“故障发现、故障响应、故障定位、故障恢复”四个关键环节,进行多方面统筹建设,从而达到增加TBF和缩短TTR的目标?_itil 应急响应

C语言头文件-程序员宅基地

文章浏览阅读58次。C系统提供了丰富的系统文件,称为库文件,C的库文件分为两类,一类是扩展名为".h"的文件,称为头文件,在前面的包含命令中我们已多次使用过。在".h"文件中包含了常量定义、 类型定义、宏定义、函数原型以及各种编译选择设置等信息。另一类是函数库,包括了各种函数的目标代码,供用户在程序中调用。 通常在程序中调用一个库函数时,要在调用之前包含该函数原型所在的".h" 文件。下面给出Turbo C的全部"...._文件头具体参数

oauth2统一认证授权_authenticationsuccessevent oauth2.0 统一认证-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏10次。oauth2.0统一认证授权1.认证与授权​ 最近学习整理了下认证授权相关实现,下面是大概的一些理解与学习过程。​ 在分布式系统中每个服务都需要认证,授权。如果每个服务都实现一套认证授权的逻辑就会显得冗余,考虑到分布式系统共享性的特点,我们可以独立一个授权服务出来,可以对内部系统或者第三方应用提供认证。1.1统一认证授权:​ 提供独立的认证服务,统一处理认证授权。不论是什么用户还是不同种类的客户端,例如小程序,APP,web,都采用一致的认证,权限,会话机制。​ 同时保持开放性,可以接入第三方外_authenticationsuccessevent oauth2.0 统一认证

使用FPGA实现ADAS设计的功能安全考虑_汽车的adas用fpga还是soc-程序员宅基地

文章浏览阅读2k次。基于雷达和摄像机的应用现在也被用于安全驾驶领域。最初,自适应巡航控制和道路偏离报警等这些高级辅助驾驶系统(ADAS)只是一些非常便利的特性。而现在,它们在车辆控制上扮演了更积极主动的角色,支持实现道路辅助保持(LKA)等功能。以前的高性能CPU被认为是最适合这些应用的器件,但是综合考虑计算性能和低功耗之后,促使工程师转而采用FPGA器件。ADAS需要满足特殊的功能安全要求。2011年,载重3.5吨..._汽车的adas用fpga还是soc

推荐文章

热门文章

相关标签