1. 程式人生 > >解題報告————最長字首 Longest Prefix

解題報告————最長字首 Longest Prefix

文章目錄

最易懂的題解

題目描述

題目描述


做題時的垂死掙扎

最先看到這道題,非常開心。哈哈一笑,暴力,然後快樂TLE

請大家以我為戒,做題前先看標籤。

然後在看到DP後,我傻眼了。(我打的就是dp啊,怎麼會錯一個點)

我盯著電腦,看著題,想了50多分鐘無關的事後。。。我終於開始了打程式碼


思路

讀入時需要注意一下字串的技巧。

然後你就暴力迴圈dp

我最開始TLE一個點是因為,我順便把連成長度為 K 的字首的方法總數也順便求了一下


#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 200002
#define N 202
#define max(a,b) a >= b? a:b//手寫max
using namespace std;
int ans,len1,i,j,len2 = 1;
char a2[M];
bool dp[M];
struct node
{
    char k[12];
}a[
N];//主要是定義成結構體,看著好看一些,可以定成二維 int main() { scanf("%s",a[len2].k); a[len2].k[11] = strlen(a[len2].k);//最大長度10,11存長度 while(a[len2].k[0] != '.')//不能寫成a[len2].k != "." { len2++; scanf("%s",a[len2].k); a[len2].k[11] = strlen(a[len2].k); } len2--; char x = getchar
();//去掉'.'後的換行符 while(~scanf("%c",&x)) if(x <= 'Z'&&x >= 'A') { len1++; a2[len1] = x; } //至此,讀入環節結束 dp[0] = 1; for(i = 1;i <= len1;i++) { int k; for(j = 1;j <= len2;j++) { if(i < a[j].k[11]) continue;//i < 長度,肯定不行的啦 bool able = 0; int it = a[j].k[11];//因為下面-- for(k = i;k > i - a[j].k[11];k--) { it--; if(a2[k] != a[j].k[it]) { able = 1; break; } } if(!able) { dp[i] += dp[i - a[j].k[11]];//就這裡,順便求了下連成長度為 K 的字首的方法總數 if(dp[i]) { ans = max(ans,i); break;//必須加,不然會TLE一個點 } } } } printf("%d",ans); return 0; }

總結

時間複雜度能減則減