字符串
KMP
const int N=1000005;
char s[N], t[N];
int len_s, len_t, nxt[N];
void GetNext(char *s)
{
for (int i=2, k=0; i<=len_s; i++)
{
while (k && s[i]!=s[k+1]) k=nxt[k];
if (s[i]==s[k+1]) k++; nxt[i]=k;
}
}
void KMP(char *s, char *t)
{
for (int i=1, k=0; i<=len_t; i++)
{
while (k && t[i]!=s[k+1]) k=nxt[k];
if (t[i]==s[k+1]) k++;
if (k==len_s){printf("%d
", i-len_s+1); k=nxt[k];}
}
}
SAM
inline void chkmax(int &x, int y){x<y?(x=y):0;}
inline void chkmin(int &x, int y){x>y?(x=y):0;}
const int N=1000005;
int son[N<<1][100], fa[N], len[N], last, cnt, n;//insert
int a[N], t[N], size[N];//sort
int mn[N], mx[N];//Get_N_LCS
int sum[N];//Get_Kth_Substr
int dp[N];//Get_N_Substr
long long ans;//Dif_Substr_Num
char s[N];
namespace SuffixAutoMaton
{
void clear()//for Dif_Substr_Num
{
memset(fa, 0, sizeof(fa));
memset(len, 0, sizeof(len));
memset(son, 0, sizeof(son));
ans=0;
}
void insert(int c)
{
int p=last, np=last=++cnt; len[np]=len[p]+1;
for (; p&&!son[p][c]; p=fa[p]) son[p][c]=np;
if (!p) fa[np]=1;
else
{
int q=son[p][c];
if (len[p]+1==len[q]) fa[np]=q;
else
{
int nq=++cnt; len[nq]=len[p]+1;
memcpy(son[nq], son[q], sizeof(son[q]));
fa[nq]=fa[q]; fa[q]=fa[np]=nq;
for (; son[p][c]==q; p=fa[p]) son[p][c]=nq;
}
}
size[np]=1;
//ans+=len[np]-len[fa[np]]; //for Dif_Substr_Num
}
void Sort()
{
for (int i=1; i<=cnt; i++) t[len[i]]++;
for (int i=1; i<=cnt; i++) t[i]+=t[i-1];
for (int i=1; i<=cnt; i++) a[t[len[i]]--]=i;
for (int i=cnt; i; i--) size[fa[a[i]]]+=size[a[i]];
}
void build()
{
scanf("%s", s+1); last=cnt=1; n=strlen(s+1);
for (int i=1; i<=n; i++) insert(s[i]-'A');
}
void Get_LCS()
{
build(); scanf("%s", s+1);
int n=strlen(s+1), p=1, Len=0, ans=0;
for (int i=1; i<=n; i++)
{
int c=s[i]-'a';
if (son[p][c]) p=son[p][c], Len++;
else
{
for (; p&&!son[p][c]; p=fa[p]);
if (p) Len=len[p]+1, p=son[p][c];
else p=1, Len=0;
}
ans=max(ans, Len);
}
printf("%d
", ans);
}
void Get_N_LCS()
{
memset(mn, 0x3f, sizeof(mn));
build(); Sort(); int ans=0;
while (~scanf("%s", s+1))
{
int n=strlen(s+1), p=1, Len=0;
for (int i=1; i<=n; i++)
{
int c=s[i]-'a';
if (son[p][c]) Len++, p=son[p][c], chkmax(mx[p], Len);
else
{
for (; p&&!son[p][c]; p=fa[p]);
if (p) Len=len[p]+1, p=son[p][c], chkmax(mx[p], Len);
else Len=0, p=1;
}
}
for (int i=cnt; i; i--)
{
int u=a[i];
chkmax(mx[fa[u]], min(mx[u], len[fa[u]]));
chkmin(mn[u], mx[u]); mx[u]=0;
}
}
for (int i=1; i<=cnt; i++) chkmax(ans, mn[i]);
printf("%d
", ans);
}
void Get_Kth_Dif_Substr()
{
Sort();
for (int i=1; i<=cnt; i++) sum[i]=size[i]=1; sum[1]=size[1]=0;
for (int i=cnt; i; i--)
for (int j=0; j<26; j++) sum[a[i]]+=sum[son[a[i]][j]];
int k=read(), u=1;
if (sum[1]<k) {puts("-1"); exit(0);}
while (k>0)
{
for (int i=0; i<26; i++) if (son[u][i])
{
if (sum[son[u][i]]<k) k-=sum[son[u][i]];
else{putchar(i+'a'); u=son[u][i]; k--; break;}
}
}
puts("");
}
void Get_Kth_Substr()
{
Sort();
for (int i=1; i<=cnt; i++) sum[i]=size[i]; sum[1]=size[1]=0;
for (int i=cnt; i; i--)
for (int j=0; j<26; j++) sum[a[i]]+=sum[son[a[i]][j]];
int k=read(), u=1; if (sum[1]<k) {puts("-1"); exit(0);}
while (k>0)
{
for (int i=0; i<26; i++) if (son[u][i])
{
if (sum[son[u][i]]<k) k-=sum[son[u][i]];
else{putchar(i+