Codeforces Round #506 (Div. 3) ---- A Many Equal Substrings (串) ★

版权声明:本文为博主原创文章,转载请预先通知博主(〃'▽'〃)。 https://blog.csdn.net/m0_37624640/article/details/82054428

题目链接

题意:让你找里面包含m个子串s的最短串t,保证这个这个最短串是唯一的

做法:日常被卡……

举几个栗子:m = 3

aba    ---->   aba ba ba

abaab  ----->  abaab aab aab

我们发现这一类前缀和后缀相同的情况下,就是寻找最大前缀和后缀,答案就是在原s串的基础上补充m个后缀前一个字符+后缀

类似模拟kmp~

AC代码:

#include<bits/stdc++.h>
#define rep(i,s,t) for(int i = (int)(s); i <= (int)(t); i++)
#define rev(i,t,s) for(int i = (int)(t); i >= (int)(s); i--)
#define pb(x) push_back(x)
#define all(x) x.begin(),x.end()
#define sz(x) (int)(x).size()
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const double PI = 4*atan(1.0);
const int maxn = 1e4+5;
const int INF = 0x3f3f3f3f;
const int mod = 1e9+7;
int main()
{
    #ifdef LOCAL_FILE
    freopen("in.txt","r",stdin);
    #endif // LOCAL_FILE
    ios_base::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int n,m,len = 0,l,r;
    string s;
    cin>>n>>m;
    cin>>s;
    for(int i = n-1;i>=0;i--){
        l = 0; r = n-i;
        while(l<i){
            if(s[l]!=s[r])
                break;
            l++;r++;
        }
        if(l == i){
            len = i;
            break;
        }
    }
    cout<<s;
    if(len!=0) s = s.substr(len,n-len);
    for(int i=1;i<m;i++)
        cout<<s;
    cout<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37624640/article/details/82054428