1. 程式人生 > 實用技巧 >P4391 [BOI2009]Radio Transmission 無線傳輸

P4391 [BOI2009]Radio Transmission 無線傳輸

原題連結

考察KMP的運用

錯誤思路:

我是求字串中沒有重合的最長前後綴,但這樣的思路遇到cabc這樣的測試資料顯然是錯誤的,因為字串複製時不一定會複製>=兩遍

正解思路:

按上面的思路,如果字串複製兩遍及以上,那麼j的最大值就是答案,如果字串複製少於2遍,答案應該是公共前後綴的長度+沒有公共的部分

公共前後綴長度 = j

沒有公共部分 = i-j+1-ne[i]-1 = i-j-ne[i]

因此答案為 i - ne[i]

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4
using namespace std; 5 const int N = 1e6+10; 6 char s[N]; 7 int len,ne[N]; 8 int main() 9 { 10 // freopen("in.txt","r",stdin); 11 scanf("%d%s",&len,s+1); 12 for(int i=2,j = 0;i<=len;i++){ 13 while(j&&s[i]!=s[j+1]) j = ne[j]; 14 if(s[i]==s[j+1]) j++; 15 ne[i] = j;
16 } 17 printf("%d\n",len-ne[len]); 18 return 0; 19 }