---恢復內容開始---
計算課的練習,今天從上午到晚上吃完飯一直在寫這個題。
先看資料量,判斷是否可以暴力窮舉。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 為字尾的字串的個數。...