字符串模板
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=1000007;
typedef long long LL;
using namespace std;
int n,m,nxt[N],ans[N];
char s1[N],s2[N];
template<typename T> void read(T &x) {
char ch=getchar(); x=0; T f=1;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') f=-1,ch=getchar();
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}
void make_nxt(char s[],int n) {
for(int i=1,k=0;i<n;i++) {
while(k&&s[i]!=s[k]) k=nxt[k-1];
if(s[i]==s[k]) k++;
nxt[i]=k;
}
}
void qry(char s[],int n,char p[],int m) {
for(int i=0,k=0;i<n;i++) {
while(k&&s[i]!=p[k]) k=nxt[k-1];
if(s[i]==p[k]) k++;
if(k==m) ans[++ans[0]]=i-m+2;
}
}
int main() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
scanf("%s",s1);
scanf("%s",s2);
n=strlen(s1);
m=strlen(s2);
make_nxt(s2,m);
qry(s1,n,s2,m);
For(i,1,ans[0]) printf("%d\n",ans[i]);
For(i,0,m-1) printf("%d ",nxt[i]); puts("");
return 0;
}
/*
ABABABC
ABA
*/
AC自动机
1 //Achen
2 #include<algorithm>
3 #include<iostream>
4 #include<cstring>
5 #include<cstdlib>
6 #include<vector>
7 #include<cstdio>
8 #include<queue>
9 #include<cmath>
10 #include<set>
11 #define For(i,a,b) for(int i=(a);i<=(b);i++)
12 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
13 const int N=1e6+7;
14 typedef long long LL;
15 using namespace std;
16 int n,ans;
17 char s[N];
18
19 template<typename T> void read(T &x) {
20 char ch=getchar(); x=0; T f=1;
21 while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
22 if(ch=='-') f=-1,ch=getchar();
23 for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
24 }
25
26 int ch[N][26],fail[N],w[N],rt,tot;
27 void insert() {
28 if(!rt) rt=++tot;
29 int len=strlen(s),x=rt;
30 For(i,0,len-1) {
31 int c=s[i]-'a';
32 if(!ch[x][c]) ch[x][c]=++tot;
33 x=ch[x][c];
34 }
35 w[x]++;
36 }
37
38 queue<int>que;
39 void get_fail() {
40 que.push(rt);
41 while(!que.empty()) {
42 int x=que.front();
43 que.pop();
44 For(i,0,25) if(ch[x][i]) {
45 int y=ch[x][i];
46 if(x==rt) fail[y]=rt;
47 else {
48 int z=fail[x];
49 while(fail[z]&&!ch[z][i]) z=fail[z];
50 if(ch[z][i]) fail[y]=ch[z][i];
51 else fail[y]=rt;
52 }
53 que.push(y);
54 }
55 }
56 }
57
58 void qry() {
59 int len=strlen(s),x=rt;
60 For(i,0,len-1) {
61 int c=s[i]-'a';
62 while(!ch[x][c]&&fail[x]) x=fail[x];
63 if(ch[x][c]) {
64 x=ch[x][c];
65 if(w[x]) ans+=w[x];
66 w[x]=0;
67 int y=fail[x];
68 while(y&&w[y]) {
69 ans+=w[y];
70 w[y]=0;
71 y=fail[y];
72 }
73 }
74 }
75 }
76
77 int main() {
78 #ifdef DEBUG
79 freopen(".in","r",stdin);
80 freopen(".out","w",stdout);
81 #endif
82 read(n);
83 For(i,1,n) {
84 scanf("%s",s);
85 insert();
86 }
87 get_fail();
88 scanf("%s",s);
89 qry();
90 printf("%d\n",ans);
91 return 0;
92 }
93 /*
94 2
95 a
96 aa
97 aa
98 */
1 //Achen
2 #include<algorithm>
3 #include<iostream>
4 #include<cstring>
5 #include<cstdlib>
6 #include<vector>
7 #include<cstdio>
8 #include<queue>
9 #include<cmath>
10 #include<set>
11 #define For(i,a,b) for(int i=(a);i<=(b);i++)
12 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
13 const int N=1e6+7;
14 typedef long long LL;
15 using namespace std;
16 int n,ansmx,ans[N],tid[157];
17 char s[N],ss[157][77];
18
19 template<typename T> void read(T &x) {
20 char ch=getchar(); x=0; T f=1;
21 while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
22 if(ch=='-') f=-1,ch=getchar();
23 for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
24 }
25
26 int ch[N][26],fail[N],rt,tot;
27 void insert(int id) {
28 if(!rt) rt=++tot;
29 int len=strlen(ss[id]),x=rt;
30 For(i,0,len-1) {
31 int c=ss[id][i]-'a';
32 if(!ch[x][c]) ch[x][c]=++tot;
33 x=ch[x][c];
34 }
35 tid[id]=x;
36 }
37
38 queue<int>que;
39 int sta[N],top;
40 void get_fail() {
41 que.push(rt);
42 while(!que.empty()) {
43 int x=que.front();
44 que.pop();
45 For(i,0,25) if(ch[x][i]) {
46 int y=ch[x][i];
47 if(x==rt) fail[y]=rt;
48 else {
49 int z=fail[x];
50 while(fail[z]&&!ch[z][i]) z=fail[z];
51 if(ch[z][i]) fail[y]=ch[z][i];
52 else fail[y]=rt;
53 }
54 que.push(y);
55 sta[++top]=y;
56 }
57 }
58 }
59
60 int cnt[N];
61 void qry() {
62 int len=strlen(s),x=rt;
63 For(i,0,len-1) {
64 int c=s[i]-'a';
65 while(!ch[x][c]&&fail[x]) x=fail[x];
66 if(ch[x][c]) {
67 x=ch[x][c];
68 cnt[x]++;
69 }
70 }
71 while(top) {
72 int x=sta[top--];
73 cnt[fail[x]]+=cnt[x];
74 }
75 ansmx=0; ans[0]=0;
76 For(i,1,n) ansmx=max(ansmx,cnt[tid[i]]);
77 For(i,1,n) if(ansmx==cnt[tid[i]]) ans[++ans[0]]=i;
78 printf("%d\n",ansmx);
79 For(i,1,ans[0]) puts(ss[ans[i]]);
80 }
81
82 int main() {
83 #ifdef DEBUG
84 freopen(".in","r",stdin);
85 freopen(".out","w",stdout);
86 #endif
87 while(scanf("%d",&n)) {
88 if(!n) break;
89 memset(ch,0,sizeof(ch));
90 memset(cnt,0,sizeof(cnt));
91 tot=rt=top=0;
92 For(i,1,n) {
93 scanf("%s",ss[i]);
94 insert(i);
95 }
96 get_fail();
97 scanf("%s",s);
98 qry();
99 }
100 return 0;
101 }
102 /*
103 2
104 aba
105 bab
106 ababababac
107 6
108 beta
109 alpha
110 haha
111 delta
112 dede
113 tata
114 dedeltalphahahahototatalpha
115 0
116 */
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=21000007;
typedef long long LL;
typedef double db;
using namespace std;
char ss[N],s[N];
int len,n,rad[N],ans;
template<typename T> void read(T &x) {
char ch=getchar(); x=0; T f=1;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') f=-1,ch=getchar();
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}
void manacher(char s[],int n) {
for(int i=1,k=0,j;i<n;) {
while(s[i-k-1]==s[i+k+1]) k++;
rad[i]=k; ans=max(ans,k);
for(j=1;j<=k&&rad[i-j]!=rad[i]-j;j++)
rad[i+j]=min(rad[i-j],rad[i]-j);
i+=j;
k=max(0,k-j);
}
}
int main() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
scanf("%s",ss);
len=strlen(ss);
s[n++]='*';
For(i,0,len) {
s[n++]='#';
s[n++]=ss[i];
}
s[n++]='#';
s[n++]='&';
manacher(s,n);
printf("%d\n",ans);
return 0;
}
1 //Achen
2 #include<algorithm>
3 #include<iostream>
4 #include<cstring>
5 #include<cstdlib>
6 #include<vector>
7 #include<cstdio>
8 #include<queue>
9 #include<cmath>
10 #include<set>
11 #define For(i,a,b) for(int i=(a);i<=(b);i++)
12 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
13 const int N=2e6+7;
14 typedef long long LL;
15 typedef double db;
16 using namespace std;
17 int n,sa[N],rak[N],h[N];
18 char s[N];
19
20 template<typename T> void read(T &x) {
21 char ch=getchar(); x=0; T f=1;
22 while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
23 if(ch=='-') f=-1,ch=getchar();
24 for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
25 }
26
27 void make_hight() {
28 For(i,0,n-1) rak[sa[i]]=i;
29 for(int i=0,k=0;i<n;i++) {
30 if(!rak[i]) continue;
31 if(k) k--;
32 int j=sa[rak[i]-1];
33 while(s[i+k]==s[j+k]) k++;
34 h[rak[i]-1]=k;
35 }
36 }
37
38 int cmp(int a,int b,int k,int y[]) {
39 int o1=a+k>=n?-1:y[a+k];
40 int o2=b+k>=n?-1:y[b+k];
41 return o1==o2&&y[a]==y[b];
42 }
43
44 void make_sa() {
45 static int t1[N],t2[N],c[N];
46 int *x=t1,*y=t2,p,m='z'+1;
47 For(i,0,m-1) c[i]=0;
48 For(i,0,n-1) c[x[i]=s[i]]++;
49 For(i,1,m-1) c[i]+=c[i-1];
50 Rep(i,n-1,0) sa[--c[x[i]]]=i;
51 for(int k=1;k<=n;k<<=1) {
52 p=0;
53 For(i,n-k,n-1) y[p++]=i;
54 For(i,0,n-1) if(sa[i]>=k) y[p++]=sa[i]-k;
55 For(i,0,m-1) c[i]=0;
56 For(i,0,n-1) c[x[y[i]]]++;
57 For(i,1,m-1) c[i]+=c[i-1];
58 Rep(i,n-1,0) sa[--c[x[y[i]]]]=y[i];
59 swap(x,y); x[sa[0]]=0; p=1;
60 For(i,1,n-1)
61 x[sa[i]]=cmp(sa[i],sa[i-1],k,y)?p-1:p++;
62 if(p>=n) break;
63 m=p;
64 }
65 make_hight();
66 }
67
68 int main() {
69 #ifdef DEBUG
70 freopen(".in","r",stdin);
71 freopen(".out","w",stdout);
72 #endif
73 scanf("%s",s);
74 n=strlen(s);
75 make_sa();
76 For(i,0,n-1) printf("%d ",sa[i]+1);
77 return 0;
78 }
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=2e6+7;
typedef long long LL;
typedef double db;
using namespace std;
int n,rt,fa[N],sz[N],l[N],ch[N][26],p,np,last,tot;
LL ans;
char s[N];
template<typename T> void read(T &x) {
char ch=getchar(); x=0; T f=1;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') f=-1,ch=getchar();
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}
void insert(int c) {
if(!rt) { rt=++tot; last=rt; }
p=last; np=++tot; last=np;
l[np]=l[p]+1; sz[np]++;
for(;p&&!ch[p][c];p=fa[p]) ch[p][c]=np;
if(!p) fa[np]=rt;
else {
int q=ch[p][c];
if(l[q]==l[p]+1) fa[np]=q;
else {
int nq=++tot; l[nq]=l[p]+1;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
fa[nq]=fa[q]; fa[q]=fa[np]=nq;
for(;p&&ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
}
}
}
void solve() {
static int sa[N],c[N];
For(i,1,tot) c[l[i]]++;
For(i,1,n) c[i]+=c[i-1];
For(i,1,tot) sa[c[l[i]]--]=i;
Rep(i,tot,1) {
int x=sa[i];
sz[fa[x]]+=sz[x];
if(sz[x]>1) ans=max(ans,(LL)sz[x]*l[x]);
}
}
int main() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
scanf("%s",s);
n=strlen(s);
For(i,0,n-1) insert(s[i]-'a');
solve();
printf("%lld\n",ans);
return 0;
}
1 //Achen
2 #include<algorithm>
3 #include<iostream>
4 #include<cstring>
5 #include<cstdlib>
6 #include<vector>
7 #include<cstdio>
8 #include<queue>
9 #include<cmath>
10 #include<set>
11 #define For(i,a,b) for(int i=(a);i<=(b);i++)
12 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
13 const int N=1e5+7;
14 typedef long long LL;
15 typedef double db;
16 using namespace std;
17 char s[N];
18 int ans,n,last,tot,rt1,rt2,ch[N][26],len[N],fail[N],l[N],r[N],sz[N];
19
20 void init() {
21 tot=0; len[rt1=0]=0; len[rt2=++tot]=-1;
22 fail[rt1]=rt2; last=rt1;
23 memset(ch,0,sizeof(ch));
24 }
25
26 void insert(int n,int c,int p[]) {
27 int x=last,y;
28 for(;s[n]!=s[n-len[x]-1];x=fail[x]);
29 if(!ch[x][c]) {
30 len[++tot]=len[x]+2;
31 for(y=fail[x];s[n]!=s[n-len[y]-1];y=fail[y]);
32 fail[tot]=ch[y][c];
33 ch[x][c]=tot;
34 }
35 last=ch[x][c];
36 sz[last]++;
37 p[n]=len[last];
38 }
39
40 int main() {
41 #ifdef DEBUG
42 freopen(".in","r",stdin);
43 freopen(".out","w",stdout);
44 #endif
45 scanf("%s",s);
46 n=strlen(s);
47 init();
48 for(int i=0;i<n;i++)
49 insert(i,s[i]-'a',l);
50 for(int i=0;i<=n/2;i++) swap(s[i],s[n-i-1]);
51 init();
52 for(int i=0;i<n;i++) insert(i,s[i]-'a',r);
53 for(int i=0;i<n-1;i++)
54 ans=max(ans,r[i]+l[n-(i+1)-1]);
55 printf("%d\n",ans);
56 return 0;
57 }