「LOJ#10045」「一本通 2.2 练习 1」Radio Transmission (KMP

题目描述

原题来自:BalticOI 2009

给你一个字符串,它是由某个字符串不断自我连接形成的。但是这个字符串是不确定的,现在只想知道它的最短长度是多少。

输入格式

第一行给出字符串的长度 L,第二行给出一个字符串,全由小写字母组成。

输出格式

输出最短的长度。

样例

样例输入 1

8
cabcabca

样例输出 1

3

样例说明

对于样例,我们可以利用 abc 不断自我连接得到 abcabcabc,读入的 cabcabca 是它的子串。

数据范围与提示

对于全部数据,1≤L≤10^6。

题解

Power-Strings的弱化版。

最小循环节直接就是$n-nxt[n]$,然后注意下边界,除一下就行了。

 1 编号     题目     状态     分数     总时间     内存     代码 / 答案文件     提交者     提交时间
 2 #228004     #10045. 「一本通 2.2 练习 1」Radio Transmission    Accepted     100     103 ms     5232 KiB     C++ / 385 B     qwerta     2018-10-14 10:14:56
 3 
 4 #include<cstdio>
 5 #include<iostream>
 6 using namespace std;
 7 string s;
 8 int nxt[1000003];
 9 int main()
10 {
11     //freopen("a.in","r",stdin);
12     int n;
13     cin>>n;
14     cin>>s;
15     int k=-1;
16     nxt[0]=-1;
17     for(int i=1;i<n;++i)
18     {
19         while(k!=-1&&s[i]!=s[k+1])k=nxt[k];
20         if(s[i]==s[k+1])k++;
21         nxt[i]=k;
22     }
23     cout<<n-(nxt[n-1]+1);
24     return 0;
25 }
原文地址:https://www.cnblogs.com/qwerta/p/9813469.html