1.題目
2.書籍
筆算next陣列
如果陣列從0開始
例如aba
bcab
ai12
3456
78k0
1123
123kt
-1001
2013
例如對於i = 5時
字尾為: b, ab, bab
字首為: a, ab, aba
最大相同字首為 ab,長度為2所以為 k = 3
同理, 如果下標從0開始就是kt。
**
i = 0;
j = next[0] = -1;
//求每個字元的最大匹配的前字尾
while(i < s.length()) else
}
例如 :
i = 4, 5, *, *, 6
j = 2, 3, 1, 0,1
優化對於 aaaab,
next =
但是如果 2 失敗,回溯到1仍舊失敗,回溯到0還是會失敗。
就是比較最大前字尾之後看看這個字元是不是和匹配字首的後一字元相等,如果相等就回溯。
改進**
i = 0;
j = next[0] = -1;
//求每個字元的最大匹配的前字尾
while(i < s.length())else next[i] = next[j];
} else
}
6.完整**
//回溯法進行匹配
char t = ; //匹配串
char s = ; //原串
int next[256];
void get_next(int length)else j = next[j];
}}int kmp(int sl, int tl)else j = next[j];
}if(j == tl)return i - j;
else return -1;
}
練習子串
字串的增加字元s.push_back()
使用進製轉換與字串的結合問題
性質:1.單點修改區間查詢
#includeusing namespace std;
typedef long long ll;
const int n = 5e5+100;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
ll a[n],b[n],c[n],n;
int lowbit(int k)
void add(int p)
}ll sum(int p)
return ans;
}bool cmp(const int &x,const int &y)
int main()
cout << ans;
return 0;
}
2.區間修改區間查詢
3.區間修改單點查詢
4.區間修改區間查詢
歸併排序
#includeusing namespace std;
typedef long long ll;
const int n = 5e5+100;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
int a[n],t[n],n;
ll ans;
void merge(int l,int r)
}while(i <= mid) t[k++] = a[i++];
while(j <= r) t[k++] = a[j++];
for(int i = l;i <= r;i ++) a[i] = t[i];
}int main()
資料結構與演算法 演算法 演算法和資料結構
資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...
資料結構 資料結構與演算法01
1 求一組整數中的最大值。演算法 基本操作是 比較兩個數的大小 模型 仔細想想 你並不知道這個整數到底是多大?整數過大你該怎麼去表示?2 足協的資料庫管理的程式 演算法 需要管理的專案?如何管理?使用者介面?模型 3 資料與資料結構 資料 所有能被輸入到計算機中,並被計算機處理的符號的集合計算機操作...
資料結構 資料結構與演算法02
1 演算法設計的原則 設計演算法時,通常應考慮達到以下目標 1,正確性 2,可讀性 3,健壯性 4,高效率與低儲存量需求 1,正確性 規格說明 四個層次 a,程式中不含語法錯誤 b,程式對於幾組輸入資料能夠得出滿足要求的結果 c,程式對精心選擇的 典型 苛刻切帶有刁難性的幾組輸入資料能夠得出滿足要求...