E : 子串循环问题 (Ver. I)

简介: 这篇文章介绍了一种利用KMP算法解决子串循环问题的C++程序,旨在找出给定字符串需要添加的最少字符数,以使其成为某个子串的循环构成。

E : 子串循环问题 (Ver. I)

Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 18     Solved: 12

Description

给定一个字符串,求需要添加至少几个字符到字符串末尾才能使得整个字符串由某一个不为本身的子串循环构成? 如“abca”,添加“bc”后构成“abcabc”,其由子串“abc”循环构成;也可以添加“abca”后构成“abcaabca”,其由子串“abca”循环构成,相比之下“bc”只有2个字符,添加的字符量最少。

Input

第一行包括一个整数T(1 <= T <= 100),代表测试组数

每组测试数据包括一行字符串,其长度范围为 [3, 10^4]

Output

对于每组测试数据

输出一个整数N,代表添加的最小字符数量

Sample Input

4
aaa
abca
abcdefg
abcabcabca

Sample Output

0
2
7
2

ac代码如下:
大致思路是:利用KMP算法中的其中一个核心函数Get_next(string a)来算next[a.size()]多少,然后分重叠串和非重叠串进行分类计算

#include<iostream>
using namespace std;

int Get_next(string a)
{
    int len=a.size();
    int i=0,k=-1;
    int *next=new int[len+1];
    next[0]=-1;
    while(i<len)
    {
        if(k==-1||a[i]==a[k])
        {
            i++,k++;
            next[i]=k;
        }
        else k=next[k];
    }
    if(next[len]*2>=len)
    {
        if(len%(len-next[len])==0)return 0;
        else return (len-next[len])-len%(len-next[len]);
    }
    else return len-next[len]*2;

}
int main()
{
    string a;
    int n;
    cin>>n;
    while(n--)
    {
        cin>>a;
        cout<<Get_next(a)<<endl;
    }
    return 0;
}
相关文章
|
12月前
|
存储 缓存 芯片
让星星⭐月亮告诉你,当我们在说CPU一级缓存二级缓存三级缓存的时候,我们到底在说什么?
本文介绍了CPU缓存的基本概念和作用,以及不同级别的缓存(L1、L2、L3)的特点和工作原理。CPU缓存是CPU内部的存储器,用于存储RAM中的数据和指令副本,以提高数据访问速度,减少CPU与RAM之间的速度差异。L1缓存位于处理器内部,速度最快;L2缓存容量更大,但速度稍慢;L3缓存容量最大,由所有CPU内核共享。文章还对比了DRAM和SRAM两种内存类型,解释了它们在计算机系统中的应用。
918 1
|
缓存 JavaScript Windows
windows环境下NPM / NodeJS的安装配置
npm(node package manager):nodejs的包管理器,用于node插件管理(包括安装、卸载、管理依赖等) 本文主要讲解如何搭建npm环境
7753 0
windows环境下NPM / NodeJS的安装配置
|
算法 C++
A : DS串应用–KMP算法
这篇文章提供了KMP算法的C++实现,包括计算模式串的next数组和在主串中查找模式串位置的函数,用于演示KMP算法的基本应用。
|
11月前
|
IDE Java 应用服务中间件
Java“ClassNotFoundException”解决
Java中的“ClassNotFoundException”表示JVM找不到指定的类。解决方法包括:确保类路径正确、检查依赖是否完整、确认类名无误、清理和重新构建项目等。
2034 0
|
11月前
|
安全 开发者
内存池池有哪些优缺点
内存池池有哪些优缺点
|
Ubuntu 网络安全 数据安全/隐私保护
使用WinSCP工具,将windows文件传输到虚拟机Ubuntu系统
使用WinSCP工具,将windows文件传输到虚拟机Ubuntu系统
2206 4
|
存储 缓存 运维
基于 Wireshark 分析 ARP 协议
基于 Wireshark 分析 ARP 协议
|
网络协议 网络架构
Wireshark中的ICMP协议包分析
Wireshark可以跟踪网络协议的通讯过程,本节通过ICMP协议,在了解Wireshark使用的基础上,重温ICMP协议的通讯过程。 ICMP(Internet Control Message Protocol)Internet控制报文协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 ICMP是TCP/IP模型中网络层的重要成员,与IP协议、ARP协议、RARP协议及IGMP协议共同构成TCP/IP模型中的网络层。 在Wireshark界面,我们可以看到
|
负载均衡 网络协议 算法
IP路由协议(RIP、IGRP、OSPF、IS-IS、BGP)
1、路由分类 路由产生方式: 直接路由:路由器会自动生成本路由器激活端口所在网段的路由条目 静态路由:网络管理员手工配置,静态路由信息在缺省的情况下私有的,不会传递给其他的路由器
|
机器学习/深度学习 存储 Shell
Google Colab免费GPU大揭晓:超详细使用攻略
Google Colab免费GPU大揭晓:超详细使用攻略