思路:其實很簡單,就是兩個字符串連接起來,中間用個特殊字符隔開,然後用後綴數組求最長公共前綴,然後不同在兩個串中,並且最長的就是最長公共子串了。
注意的是:用第一個字符串來判斷是不是在同一個字符中,剛開始用了第二個字符的長度來判斷WA了2發才發現。
#include #include #include #include #include #include #include #include #include #define mem(a,b) memset(a,b,sizeof(a)) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define llson j<<1,l,mid #define rrson j<<1|1,mid+1,r #define INF 0x7fffffff #define maxn 200010 using namespace std; typedef long long ll; typedef unsigned long long ull; void radix(int *str,int *a,int *b,int n,int m) { static int count[maxn]; mem(count,0); for(int i=0; i=0; i--) b[--count[str[a[i]]]]=a[i]; } void suffix(int *str,int *sa,int n,int m) //倍增算法計算出後綴數組sa { static int rank[maxn],a[maxn],b[maxn]; for(int i=0; i=n?0:rank[j+(1<>s>>ss) { ss=s+"#"+ss; copy(ss.begin(),ss.end(),a); int n=ss.size(),len=0; suffix(a,sa,n,256); calcHeight(a,sa,height,rank,n); for(int i=1; ilen&&((sa[i]
c++中六種構造函數的實現以及9中情況下,構造函數的調用過程
假如你正在寫從文件或網絡讀寫數據的跨平台C/C+
LeetCode題解 || Longest Substrin
迭代器 迭代器用於存取一個序列中的元素,其用法類似於指
HDU - 4112 Break the Chocolate
java數據類型,java基本數據類型java數據類型: j