标签:一个 oid get smis open input 最长前缀 sed display
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 }
标签:一个 oid get smis open input 最长前缀 sed display
原文地址:https://www.cnblogs.com/Osea/p/11333525.html