A. Many Equal Substrings(思維)
阿新 • • 發佈:2018-10-31
寫這題順便學了下string類裡substr的用法substr有2個引數,第一個引數為你需要擷取的子串的起始位置的索引(下標),第二個引數為從起始位置開始擷取的長度。
這題就用到了substr函式,這題首先要分2種情況,一種是t串裡不含相同的字首字尾時,s串裡有多少個t串,就輸出多少次t串就可以了,這樣可以保證是最短的,第二種就是有相同字首字尾,那就把最大的相同字首字尾的長度求出來,每次輸出t串時就不必整個t串都輸出了,因為t串具有相同字首字尾這個性質,前面一個輸出的t串的字尾就可以作為當前輸出的t串的字首,這樣子就可以保證是最短的。
#include<bits/stdc++.h> using namespace std; string s; int n,ti,nxt[55]; int main() { scanf("%d %d",&n,&ti); cin>>s; nxt[0]=0; for(int i=1,k=0;i<n;i++) { while(k>0&&s[i]!=s[k]) k=nxt[k-1]; if(s[i]==s[k]) k++; nxt[i]=k; } if(nxt[n-1]==0) { while(ti--) cout<<s; cout<<endl; return 0; } string p=s.substr(nxt[n-1],n-nxt[n-1]); cout<<s; for(int i=2;i<=ti;i++) { cout<<p; } cout<<endl; return 0; }