1. 程式人生 > >Many Equal Substrings CodeForces - 1029A (kmp next陣列應用)

Many Equal Substrings CodeForces - 1029A (kmp next陣列應用)

題目大意

題目看樣例也能猜到就是輸出最短的迴圈串。

吐槽

明明是div3第一題為啥子還會用到kmp的知識?

解法

這個題仔細看發現是求最長可去除的字尾,也就是說去除跟下一個相同的字串還能連線起來。這個不就是next陣列的功能嗎?最長公共前後綴。

公式:len-next[len]

我們把前k-1個字串只輸出前面的部分最後加上一個完整的字串即可

完整程式碼

#include <bits/stdc++.h>
using namespace std;
char a[500];
int nex[500];
int maxn=-1;
void get()
{
  int j=0;
  for(int i=2;i<=strlen(a+1);i++)
  {
    while(j&&a[i]!=a[j+1])
    j=nex[j];
    if(a[i]==a[j+1])
    j++;
    nex[i]=j;
  }
}
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n,t;
  cin>>n>>t;
  cin>>a+1;
  get();
  int ans=strlen(a+1)-nex[strlen(a+1)];
  for(int i=0;i<t-1;i++)
  for(int j=1;j<=ans;j++)
  cout<<a[j];
  cout<<a+1;
}