kmp這裡講的不錯next的求法值得借鑑
這道題要用到kmp,基於鄺斌牌模板,複雜度o(m+n)
一開始t了,用了字尾陣列,複雜度o(nlog2n)
#include#include#include
#include
#include
using
namespace
std;
#define n 100010
char s[n * 10
], p[n];
/** next的含義:x[i-next[i]...i-1]=x[0...next[i]-1]
* next[i]為滿足x[i-z...i-1]=x[0...z-1]的最大z值(就是x的自身匹配)
*/void kmp_pre(char x,int m,int
next)}/*
* kmpnext的意思:next'[i]=next[next[...[next[i]]]] (直到next'[i]<0或者x[next'[i]]!=x[i])
* 這樣的預處理可以快一些
*//*
void prekmp(char x,int m,int kmpnext)
}return
ans;
}int
main()
return0;
}
#include#includet掉的 字尾陣列#include
#include
#include
using
namespace
std;
intn,k,m,number;
int rank[1000005],tmp[1000005],sa[1000005
];bool common_sa(int i,intj)}
void construct_sa(string s,int *sa)
for(k=1;k<=m;k*=2) //
這裡的k是遞迴到長度為k的串
for(int i=0;i<=n;i++)
}}bool contain(string s,int *sa,string
t)
return s.compare(sa[b],t.length(),t)==0;}
intmain()
break
; }
}cout}}
return0;
}
字尾陣列這裡也有值得說的
rank陣列對字串長度做1 2 4 8這樣的增長式劃分,劃分的最大長度可以直接定為匹配串的長度,
這樣根據rank陣列的值和位置就能知道相同的串個數了。
字串專題
created on 2019年12月1日 author hp 擷取字串 str2 我是迪迦奧特曼 str3 str2 5 str4 str2 0 len str2 2 print str3,str4 擷取的字串如果不存在,會出現異常,可以用try.except捕捉異常 try str5 str2 ...
字串專題
給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被視作不同的子串。示例1 輸入 abc 輸出 3 解釋 三個回文子串 a b c 示例 2 輸入 aaa 輸出 6 解釋 6個回文子串 a a a aa aa aaa 解法 1 動態...
字串專題
1.double ceil double x 求大於 x 的最小的數,即向上取整函式 includeusing namespace std intmain 2.a 65 z 90 a 97 z 122 3.字串刪除 c 從string中刪除所有的某個特定字元 超好 includeusing name...