刷題 1 FJOI2015 所有公共子串行問題

2021-07-29 13:05:12 字數 1234 閱讀 7710

題意簡述:

給定兩個長度分別為n,m的字串x,y以及乙個整數k。

若k=0,輸出x,y的公共子串行個數

若k=1,輸出x,y的所有公共子串行以及個數,空集算在內。(字元只有英文大小寫字母)

這一道題我剛開始沒什麼思路,然後看了一下題解,發現做法不是按照一位一位來,而是按照字元來建造trie樹。

於是自己思考了一下做法,以0位根節點,對於每個(i

,j)(

i,to[

i][s

[j]]

=j,這樣在dfs的時候省去了很多步驟,建造trie的時間是o(

n2) 的,那麼我們就可dfs了,由於k=

1 要全部輸出,我們不用優化了,過不了還要打出題人呢。。。 k=

0 時,f[

i][j

] 表示做到(i

,j) 的答案,記憶化搜尋就可以過了。

在做這題的時候,我遇到了兩個問題,隨時都可能在比賽上置我於死地。

1.我將』a』~』z』,』a』~』z』從小寫到大寫離散化,導致輸出不會按照大小寫大寫優先的字典序,還好資料弱有80分,考場上寫掛了真的太可怕了。。。

2.差點調**,我的下標從1開始,可是我輸入的時候是scanf(「%s」,s)而不是scanf(「%s」,s+1)導致我調了1個小時,斷點輸出了好幾段(**裡有)

**:

#include

#include

#include

#include

int table[300],val[300];

struct trie

void build()

void out()

void scan()

}x,y;

int n,m,k;

char stk[3010];

long long f[3010][3010];

long long dfs(int i,int j,int top=0)

top++;

for(int c=1;c<=52;c++)

if(x.t[i][c]&&y.t[j][c])

// printf("next = (%d , %d)\n",x.t[i][c],y.t[j][c]),

stk[top]=val[c],res+=dfs(x.t[i][c],y.t[j][c],top);

return res;

}int main()

刷題 2 FJOI2015 建築師

求1 n的全排列構成的建築裡裡,有多少個排列,從左邊看能看到a個,右邊看能看到b個 一看資料範圍 n 50000 資料組數t 200000 覺得找規律 於是乎 暴力找規律 include include include include const int mod 1000000007 int vis...

杭電Oj刷題(2015)

題目描述 有乙個長度為n n 100 的數列,該數列定義為從2開始的遞增有序偶數,現在要求你按照順序每m個數求出乙個平均值,如果最後不足m個,則以實際數量求平均值。程式設計輸出該平均值序列。input 輸入資料有多組,每組佔一行,包含兩個正整數n和m,n和m的含義如上所述。output 對於每組輸入...

日常刷題 (1)

牛客刷題 1.有關類的說法不正確的是 d a.類是一種使用者自定義的資料型別 b類中的成員函式可以訪問類中的私有資料 c在類中,如果不作特別說明,所有的資料均為私有型別 d在類中,如果不作特別說明,所有的成員函式均為公有型別 解析 在c 中,類預設的方式時private,不管是繼承方式還是成員。2....