KMP66pts求调
查看原帖
KMP66pts求调
779997
like_tis楼主2024/8/22 22:19
#include<cstdio>
#include<iostream>
#include<string>
#define ll long long
using namespace std;
string a[205],st;
int n=1,kmp[205][15],ans;
bool dp[200005],found[200005][15];
int main(){
    cin>>a[1];
    while(a[n]!=".") cin>>a[++n];
    n--;
    for(string tmp;cin>>tmp;st+=tmp);
    for(int i=1;i<=n;i++){
        int j=0;
        for(int k=1;k<a[i].size();k++){
            while(j&&a[i][j]!=a[i][k]) j=kmp[i][j-1];
            if(a[i][j]==a[i][k]) j++;
            kmp[i][k]=j;
        }
        j=0;
        for(int k=0;k<st.size();k++){
            while(j&&a[i][j]!=st[k]) j=kmp[i][j-1];
            if(a[i][j]==st[k]) j++;
            if(j==a[i].size()){
                found[k-j+1][i]=true;
                j=kmp[i][j-1];
            }
        }
    }
    dp[0]=true;
    for(int i=1;i<=st.size();i++){
        for(int j=1;j<=n;j++){
            int len=a[j].size();
            if(i>=len&&dp[i-len]&&found[i-len][j]){
                dp[i]=true;
                ans=i;
                break;
            }
        }
    }
    printf("%d",ans);
    return 0;
}
2024/8/22 22:19
加载中...