題意簡述:
給定兩個長度分別為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....