问题 L: 【KMP】Radio Transmission
题目描述
给你一个字符串,它是由某个字符串不断自我连接形成的。但是这个字符串是不确定的,现在只想知道它的最短长度是多少。
输入
第一行给出字符串的长度L,第二行给出一个字符串,全由小写字母组成。
输出
输出最短的长度。
样例输入
8 cabcabca
样例输出
3
提示
我们可以利用abc不断自我连接得到abcabcabc,读入的cabcabca是它的子串。
对于全部数据,1≤L≤1e6
【题意】:
题意花里胡哨,其实就是问,最小循环串。
【题解】:
kmp的强大应用,可以利用最长前缀来处理该问题。
相关解释可以去b站搜索ACwing——字符串和哈希。
结论是:m-next[m] 最小循环串的长度。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N = 1e6+100; 4 char p[N]; 5 int Next[N],m; 6 void get_Next(){ 7 for(int i=2,j=0 ; i<=m ; i++ ){ 8 while( j && p[i] != p[j+1] ) j = Next[j]; 9 if( p[i] == p[j+1] ) j ++; 10 Next[i] = j ; 11 } 12 } 13 int main() 14 { 15 scanf("%d",&m); 16 scanf("%s",p+1); 17 get_Next(); 18 /* 19 for(int i=1;i<=m;i++){ 20 printf("%d%c",Next[i],i==m?‘\n‘:‘ ‘); 21 } 22 */ 23 printf("%d\n",m-Next[m]); 24 return 0; 25 }
原文地址:https://www.cnblogs.com/Osea/p/11333525.html
时间: 2024-10-15 05:05:03