其實就是模板彙總好伐
1、字串hash
可以解決一切字串問題。
複雜度成迷。
#include
using
namespace std;
#define maxn 10000
#define read(x) scanf("%d",&x)
#define maxm 1500
#define ull unsigned long long
#define p 131
int n;
char a[maxn+5]
[maxm+5]
;ull hash[maxn+5]
;ull make_hash
(int x)
return y;
}int
main()
sort
(hash+
1,hash+n+1)
;int cnt=0;
for(
int i=
1;i<=n;i++
)printf
("%d"
,cnt)
;return0;
}
2、manacher演算法
求最長回文子串長度。
複雜度o(n)
#include
using
namespace std;
#define maxn 22000000
char b[maxn+5]
,a[maxn+5]
;int n;
int p[maxn+5]
;int
main()
a[n*2]
='#';
n*=2;
n-=1;
int id=
0,mx=0;
p[0]=
1;for(
int i=
1;i<=n;i++)}
int ans=0;
for(
int i=
1;i<=n;i++
)printf
("%d"
,ans)
;return0;
}
3、kmp
單文字串、單模式串 字串匹配。
複雜度o(n)
#include
using
namespace std;
#define maxn 1000000
char a[maxn+5]
,b[maxn+5]
;//a為文字串,b為模式串
int n,m;
//a、b的長度
int nxt[maxn+5]
=;//0~i的公共前字尾長
void
readin()
void
make_nxt()
nxt[i+1]
=j+1;}
//此時的nxt需整體前移
for(
int i=
0;i) nxt[i]
=nxt[i+1]
;}void
mtch()
if(a[i]
==b[j]
) j++
;//為了防止j==0要加一步判斷
if(j==m)
}for
(int i=
0;i)printf
("%d "
,nxt[i]);
}int
main()
4、ac自動機
本質 trie + kmp 。
單文字串、多模式串 字串匹配。
複雜度大概o(n+m)。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
#define maxn 1000000
#define maxs 26
struct ac
void
insert
(char
* x,
int len)
u=ch[u]
[y];
} val[u]++;
}void
make_fail()
while
(!que.
empty()
) que.
push
(ch[u]
[i])
; fail[ch[u]
[i]]
=ch[fail[u]
][i];}
}}void
find
(char
* s,
int len)}}
};int n;
ac ac;
intmain()
ac.make_fail()
;char s[maxn+5]
;scanf
("%s"
,s);
ac.find
(s,strlen
(s))
;printf
("%d"
,ac.sum)
;return0;
}
#include
using
namespace std;
#define maxn 150
#define maxd 70
#define maxm maxn*maxd
#define maxa 1000000
#define s 26
int n;
struct ac
void
insert
(char
* x,
int len,
int j)
u=ch[u]
[y];
} val[u]++;
mp[j]
=u;}
void
make_fail()
while
(!que.
empty()
)else}}
}void
find()
}void
readin()
make_fail()
;scanf
("%s"
,a);
}void
print()
printf
("%d\n"
,ans)
;for
(int i=
1; i<=n; i++)}
}};
ac ac;
intmain()
return0;
}
5、sa
字尾排序和lcs問題,複雜度o(n log n)
基於倍增的低效演算法。
sa:字尾陣列
rk:i 的排名
tax、tp:桶
#include
using
namespace std;
#define maxn 1000000
int n,m;
char a[maxn+5]
;int sa[maxn+5]
,rk[maxn+5]
;int tax[maxn+5]
,tp[maxn+5]
;void
readin()
void
rsort()
void
makesa()
if(num==n)
break
; m=num;}}
intmain()
字串總結
字串輸入輸出 getchar 與putchar include include using namespace std int main 兩種輸入方式 scanf c x 只讀取乙個字元 scanf s x 遇到空格,換行才會停止 cin與scanf s x 的作用大致相同 c char st 10...
字串總結
1 找出回文子串 分析 對於回文子串,最深的印象就是正序和倒序產生的字元相同。其實更深刻的表述方式應該是去除首尾字元後,裡面的依然是個回文子串。這一點也是我沒有想到的。利用動態規劃,相當於乙個遞迴歸納的想法,只要s i 1 j 1 是個回文子串,那麼在s i s j 時,s i j 就是個回文子串。...
字串 總結
一級目錄 輸入字元 cin 不得輸入空格 a getchar 可輸入空格 可輸入空格 gets a fgets a,sizeof a stdin 注意 當使用gets 和fgets 給字元陣列賦值時,前面如果使用過cin輸入,則需要getchar 吸收上一次輸入時剩下的回車 isdigit int ...