程式設計 字尾字串

2022-05-31 01:30:13 字數 3183 閱讀 8425

---恢復內容開始---

計算課的練習,今天從上午到晚上吃完飯一直在寫這個題。

先看資料量,判斷是否可以暴力窮舉。n最大10w,互相比較每兩個字串要(1+10w)/2*10w大概50億次,

但是這個數還要再乘上兩個字串比較時所用的「=」操作符函式的用的時間,這個函式時間複雜度與字串長度正相關。

題中字串長度最大為10;即最大資料500億,時間兩秒,計算機cpu雙2.5ghz ,每秒大概運算幾十億次,所以排除;

然後直接的思路就是想到如果有字串aba ba a,則a時ba的字尾,且如果ba是aba的字尾,則a一定是aba的字尾。

也就是說,從小向大找的話,以最小的字串a為一級字串,找到所有以a為字尾的二級字串~以此類推到n級字串,

且無以第n級字串為字尾的字串,則該級字串字尾次數為1,那麼該字串的n-1級字尾字串的字尾出現次數就是所有n級

字尾次數之和。以此類推num[n-1](只是n級中的乙個)=num[n1]+num[n2]+……+num[nm];上述n1~nm都是以相應n-1為字尾的。

明顯的遞迴結構,把遞迴條件和遞迴分析出來就開始寫,於是:

#include

#include

#include

#include

#define data_max 150000

#define rep(i,n,t) for(int i=(n);i<(t);i++)

#define per(i,n,t) for(int i=(n);i>(t);i--)

#define mms(a,b) memset(a,(b),sizeof(a))

//#define vector::iterator it

using namespace std;

int book[data_max];

bool comp(paira, pairb)

int solve(vector> &l,int now,int cur)

else if (l[now].first == l[i].first.substr((l2 - l1), l1))

if (flag)

}int booknumber = l[now].second;

l.erase(l.begin() + now);

if(same.size()!=1)

return booknumber;

}int main()

sort(input.begin(), input.end(), comp);

rep(i, 0, input.size())

//輸出部分

rep(i, 0, n) cout << book[i] << endl;

return 0;

}結果果不其然超時了,超時了大概一秒,因為遞迴的多層呼叫太慢了,所以想當然的想把遞迴想用動態規劃之類的方式改成迴圈

#include#include

#include

#include

#include

#define data_max 150000

#define rep(i,n,t) for(int i=(n);i<(t);i++)

#define per(i,n,t) for(int i=(n);i>(t);i--)

#define mms(a,b) memset(a,(b),sizeof(a))

//#define vector::iterator it

using

namespace

std;

intbook[data_max];

bool comp(pair a, pairb)

intmain()

sort(input.begin(), input.end(), comp);

int now = 0; int j = 1

;

int booknumber; vectorint>> same; vectors;

while

(input.size())

else

if (input[now].first == input[j].first.substr((l2 -l1), l1))

temp.clear();}}

if(s.size())

else

book[input[now].second] +=book[booknumber];

}else

}rep(i,

0, same.size())

}//輸出部分

rep(i, 0, n) cout << book[i]

}

結果改到了晚上能過一些資料,但是還是有錯。

這時才反思自己是不是思路有問題,有這一天的時間比賽都比好幾場了。

結果在網上找到了這個。。。。。

字尾字串排序

題目描述 對於乙個字串,將其字尾子串進行排序,例如grain 其子串有 grain rain ain in n 然後對各子串按字典順序排序,即 ain,grain,in,n,rain 輸入描述 每個案例為一行字串。輸出描述 將子串排序輸出 示例1 輸入grain 輸出ain grain in n r...

map 字尾字串

一天蒜頭君得到 n 個字串 si?每個字串的長度都不超過 10。蒜頭君在想,在這 n 個字串中,以 si 為字尾的字串有多少個呢?輸入格式 第一行輸入乙個整數 n。接下來 n 行,每行輸入乙個字串 si。輸出格式 輸出 n 個整數,第 i個整數表示以 si為字尾的字串的個數。資料範圍 對於 50 的...

查詢字尾字串出現的次數

一天蒜頭君得到 nn 個字串 s isi 每個字串的長度都不超過 1010。蒜頭君在想,在這 nn 個字串中,以 s isi 為字尾的字串有多少個呢?第一行輸入乙個整數 nn。接下來 nn 行,每行輸入乙個字串 s isi 輸出 nn 個整數,第 ii 個整數表示以 s isi 為字尾的字串的個數。...