ABC347B Substring

xinyimama發表於2024-04-27

題目描述

給你一個由小寫英文字母組成的字串 S, S 有多少個不同的非空子串?

子串是連續的子序列。例如,xxx是yxxxy的子串,但不是xxyxx的子串。

資料範圍:S 是長度在 1 和 100 之間(含)的字串,由小寫英文字母組成。
題解

我認為這道題放在普及組的話,非常適合放在第一題和第二題之間,當我們看到資料範圍是100的話,這個最大可承受的時間複雜度是\(O(n^4)\),所以我們可以列舉。這裡要求的是所以不同的非空子串的長度,所以我們需要在每個長度上都找出是否有相同的子串,比如說yay,在長度為1的時候,就是相同的非空子串

所以第一個維度我們應該先列舉長度len,第二個維度列舉起點i,那麼終點我們就知道了,是j=i+len,對於每一個\((i,j)\)之間的子串,我們來比較長度為len的,起點k在\([1-i-1]\)的所有子串,是否和\([i,len]\)的子串相同,所以我們列舉len,列舉起點i,列舉子集的起點k,比較字串是否相等,時間複雜度是\(o(n^4)\),程式碼如下:

點選檢視程式碼
#include <bits/stdc++.h>

using namespace std;

const int maxn=105;
char s[maxn];

int ans;
int main(){
    scanf("%s",s+1);
    int n=strlen(s+1);
    for(int len=1;len<=n;len++){
        for(int i=1;i<=n;i++){
            if(i+len-1>n) break;
            int cnt=0;
            for(int j=1;j<i;j++){
                int k=0;
                while(s[i+k]==s[j+k]&&k<len) k++;
                if(k==len) {
                    cnt=1;
                    break;
                }
            }
            if(cnt==0) {
                //cout<<i<<endl;
                ans+=1;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

相關文章