這個問題是正在進行的競爭的一部分,我已經解決了這個問題數據集的75%,但是25%給了我TLE。我問爲什麼它是給TLE
的,我相信我的複雜性是O(n*n)
問:由N小寫英文字母的
字符串s。我們已經準備了一張清單L,由all non empty substrings of the string S
組成。
現在他問你Q個問題。到第i個問題,你需要計數的方式的數量來選擇從L
正是文等於字符串,例如:尋找最佳解決方案的Trie數據結構
String = ababa
L = {"a", "b", "a", "b", "a", "ab", "ba", "ab", "ba", "aba", "bab", "aba", "abab", "baba", "ababa"}.
k1 = 2: There are seven ways to choose two equal strings ("a", "a"), ("a", "a"), ("a", "a"), ("b", "b"), ("ab", "ab"), ("ba", "ba"), ("aba", "aba").
k2 = 1: We can choose any string from L (15 ways).
k3 = 3: There is one way to choose three equal strings - ("a", "a", "a").
k4 = 4: There are no four equal strings in L .
Question LINK
我的做法
我使IT的TRIE和計算和陣列F [i]其中F [i]表示我等於字符串發生的次數。 我TRIE:
static class Batman{
int value;
Batman[] next = new Batman[26];
public Batman(int value){
this.value = value;
}
}
MY插入函數
public static void Insert(String S,int[] F , int start){
Batman temp = Root;
for(int i=start;i<S.length();i++){
int index = S.charAt(i)-'a';
if(temp.next[index]==null){
temp.next[index] = new Batman(1);
F[1]+=1;
}else{
temp.next[index].value+=1;
int xx = temp.next[index].value;
F[xx-1]-=1;
F[xx]+=1;
// Calculating The Frequency of I equal Strings
}
temp = temp.next[index];
}
}
我的主要功能
public static void main(String args[]) throws java.lang.Exception {
Root = new Batman(0);
int n = in.nextInt();
int Q = in.nextInt();
String S = in.next();
int[] F = new int[n+1];
for(int i=0;i<n;i++)
Insert(S,F,i);
long[] ans = new long[n+1];
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
ans[i]+= F[j]*C[j][i]; // C[n][k] is the Binomial Coffecient
ans[i]%=mod;
}
}
while(Q>0){
Q--;
int cc = in.nextInt();
long o =0;
if(cc<=n) o=ans[cc];
System.out.println(o+" "+S.length());
}
}
爲什麼我appraoch是給TLE的時間複雜度爲O( N * N)和String的長度是N < = 5000。請幫我Working CODE
請記住'10n * n'和'1000000n * n'都是'O(n * n)'。 – azurefrog
@azurefrog我無法理解你,請解釋 – user4996457
思考[「大O」符號](http://stackoverflow.com/questions/487258/plain-english-explanation-of-big-o),特別是當你正試圖[爲你的程序計算](http://stackoverflow.com/questions/3255/big-o-how-do-you-calculate-approximate-it),你需要記住,當n是小的(就像在你的例子中),二次項在總時間中占主導地位的時間要比在n很大的時候少得多。僅僅因爲你的程序是O(n * n)並不意味着它會很快運行,只是它的運行時間縮放會隨着輸入大小的平方而變化。 – azurefrog