解題報告————最長字首 Longest Prefix
阿新 • • 發佈:2018-12-01
文章目錄
最易懂的題解
題目描述
做題時的垂死掙扎
最先看到這道題,非常開心。哈哈一笑,暴力,然後快樂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;
}
總結
時間複雜度能減則減