Skip to content

Commit eef2364

Browse files
committed
template
0 parents  commit eef2364

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+2133
-0
lines changed

【模板】AC自动机.cpp

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#include<cstdio>
2+
#include<algorithm>
3+
#include<cstring>
4+
#include<queue>
5+
using namespace std;
6+
const int maxn=1e6+10;
7+
int rt,n;
8+
char str[maxn];
9+
struct fy
10+
{
11+
int son[26],fail,sum;
12+
}ac[maxn];
13+
void add(char str[])
14+
{
15+
int l=strlen(str),root=0;
16+
for(int i=0;i<l;i++)
17+
{
18+
int a=str[i]-'a';
19+
if(!ac[root].son[a]) ac[root].son[a]=++rt;
20+
root=ac[root].son[a];
21+
}
22+
ac[root].sum++;
23+
}
24+
void make()
25+
{
26+
queue<int> q;
27+
for(int i=0;i<26;i++)
28+
{
29+
if(ac[0].son[i])
30+
{
31+
ac[ac[0].son[i]].fail=0;
32+
q.push(ac[0].son[i]);
33+
}
34+
}
35+
while(!q.empty())
36+
{
37+
int a=q.front();q.pop();
38+
for(int i=0;i<26;i++)
39+
{
40+
if(ac[a].son[i])
41+
{
42+
ac[ac[a].son[i]].fail=ac[ac[a].fail].son[i];
43+
q.push(ac[a].son[i]);
44+
}
45+
else ac[a].son[i]=ac[ac[a].fail].son[i];
46+
}
47+
}
48+
}
49+
int acm(char str[])
50+
{
51+
int l=strlen(str);
52+
int root=0,ans=0;
53+
for(int i=0;i<l;i++)
54+
{
55+
root=ac[root].son[str[i]-'a'];
56+
for(int j=root;j&&ac[j].sum!=-1;j=ac[j].fail)
57+
{
58+
ans+=ac[j].sum;
59+
ac[j].sum=-1;
60+
}
61+
}
62+
return ans;
63+
}
64+
int main()
65+
{
66+
scanf("%d",&n);
67+
while(n--)
68+
{
69+
scanf("%s",str);
70+
add(str);
71+
}
72+
ac[0].fail=0;
73+
make();
74+
scanf("%s",str);
75+
printf("%d\n",acm(str));
76+
return 0;
77+
}
+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#include<cstdio>
2+
#include<algorithm>
3+
#include<iostream>
4+
#include<cstring>
5+
#include<queue>
6+
using namespace std;
7+
const int maxn=2e4+10,maxl=1e6+10;
8+
int n,rt,bi;
9+
char str[160][80],mu[maxl];
10+
int ans[maxl];
11+
struct fy
12+
{
13+
int son[26],fail,w;
14+
}ac[maxl];
15+
void add(char str[],int v)
16+
{
17+
int l=strlen(str),root=0;
18+
for(int i=0;i<l;i++)
19+
{
20+
int a=str[i]-'a';
21+
if(!ac[root].son[a]) ac[root].son[a]=++rt;
22+
root=ac[root].son[a];
23+
}
24+
ac[root].w=v;
25+
}
26+
void make()
27+
{
28+
queue<int>q;
29+
for(int i=0;i<26;i++)
30+
if(ac[0].son[i]) q.push(ac[0].son[i]);
31+
while(!q.empty())
32+
{
33+
int a=q.front();q.pop();
34+
for(int i=0;i<26;i++)
35+
{
36+
if(ac[a].son[i])
37+
{
38+
ac[ac[a].son[i]].fail=ac[ac[a].fail].son[i];
39+
q.push(ac[a].son[i]);
40+
}
41+
else ac[a].son[i]=ac[ac[a].fail].son[i];
42+
}
43+
}
44+
}
45+
void acm(char str[])
46+
{
47+
int l=strlen(str),root=0;
48+
for(int i=0;i<l;i++)
49+
{
50+
root=ac[root].son[str[i]-'a'];
51+
for(int j=root;j;j=ac[j].fail)
52+
if(ac[j].w)
53+
{
54+
ans[ac[j].w]++;
55+
bi=max(bi,ans[ac[j].w]);
56+
}
57+
}
58+
}
59+
int main()
60+
{
61+
while(scanf("%d",&n)==1&&n!=0)
62+
{
63+
memset(&ac,0,sizeof ac);
64+
bi=0;
65+
memset(ans,0,sizeof ans);
66+
for(int i=1;i<=n;i++)
67+
{
68+
scanf("%s",str[i]);
69+
add(str[i],i);
70+
}
71+
make();scanf("%s",mu);
72+
acm(mu);
73+
printf("%d\n",bi);
74+
for(int i=1;i<=n;i++)
75+
if(ans[i]==bi) cout<<str[i]<<endl;
76+
}
77+
return 0;
78+
}
+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include<cstdio>
2+
#include<algorithm>
3+
#include<cstring>
4+
using namespace std;
5+
const int maxn=30,inf=0x7fffffff;
6+
int n,v[maxn][maxn],v1[maxn][maxn],lx[maxn],ly[maxn],p[maxn],ans,minx;
7+
bool usex[maxn],usey[maxn];
8+
bool dfs(int a)
9+
{
10+
usex[a]=true;
11+
for(int i=1;i<=n;i++)if(!usey[i])
12+
{
13+
int t=lx[a]+ly[i]-v[a][i];
14+
if(t==0)
15+
{
16+
usey[i]=true;
17+
if(!p[i]||dfs(p[i]))
18+
{p[i]=a;return true;}
19+
}
20+
else if(t)minx=min(minx,t);
21+
}
22+
return false;
23+
}
24+
void km()
25+
{
26+
for(int i=1;i<=n;i++)while(1)
27+
{
28+
minx=inf;memset(usex,false,sizeof usex);memset(usey,false,sizeof usey);
29+
if(dfs(i)) break;
30+
for(int j=1;j<=n;j++)if(usex[j])lx[j]-=minx;
31+
for(int j=1;j<=n;j++)if(usey[j])ly[j]+=minx;
32+
}
33+
}
34+
int main()
35+
{
36+
scanf("%d",&n);
37+
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&v[i][j]);
38+
// ×îСƥÅä³õÖµ·´×ªÎª¸º
39+
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)lx[i]=max(lx[i],v[i][j]);
40+
km();
41+
for(int i=1;i<=n;i++)ans+=v[p[i]][i];printf("%d\n",ans);
42+
return 0;
43+
}

【模板】KMP字符串匹配.cpp

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#include<cstdio>
2+
#include<cstring>
3+
#include<algorithm>
4+
using namespace std;
5+
const int maxn=1e6+10;
6+
int n,m,next[maxn];
7+
char str[maxn],stt[maxn];
8+
void makenext()
9+
{
10+
int j=0;
11+
for(int i=1;i<m;i++)
12+
{
13+
while(j&&stt[j]!=stt[i])
14+
j=next[j-1];
15+
if(stt[j]==stt[i]) j++;
16+
next[i]=j;
17+
}
18+
}
19+
void kmp()
20+
{
21+
int j=0;
22+
makenext();
23+
for(int i=0;i<n;i++)
24+
{
25+
while(j&&stt[j]!=str[i])
26+
j=next[j-1];
27+
if(stt[j]==str[i]) j++;
28+
if(j==m) printf("%d\n",i-j+2);
29+
}
30+
}
31+
int main()
32+
{
33+
scanf("%s%s",str,stt);
34+
n=strlen(str);m=strlen(stt);
35+
kmp();
36+
for(int i=0;i<m;i++)
37+
printf("%d ",next[i]);
38+
return 0;
39+
}

【模板】ST表.cpp

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include<cstdio>
2+
#include<algorithm>
3+
using namespace std;
4+
const int maxn=1e5+10;
5+
int n,m,ma[maxn][40],log[maxn];
6+
int main()
7+
{
8+
scanf("%d%d",&n,&m);
9+
log[0]=-1;
10+
for(int i=1;i<=n;i++)
11+
{
12+
scanf("%d",&ma[i][0]);
13+
if((i&(i-1))==0) log[i]=log[i-1]+1;
14+
else log[i]=log[i-1];
15+
}
16+
for(int j=1;j<=log[n];j++)
17+
for(int i=1;i+(1<<j)-1<=n;i++)
18+
ma[i][j]=max(ma[i][j-1],ma[i+(1<<(j-1))][j-1]);
19+
for(int i=1;i<=m;i++)
20+
{
21+
int x,y;
22+
scanf("%d%d",&x,&y);
23+
int k=log[y-x+1];
24+
printf("%d\n",max(ma[x][k],ma[y-(1<<k)+1][k]));
25+
}
26+
return 0;
27+
}

【模板】floyd最小环.cpp

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#include<cstdio>
2+
#include<cstring>
3+
#include<algorithm>
4+
#define ll long long
5+
using namespace std;
6+
const int maxn=210,inf=0x3f3f3f3f;
7+
int n,m,xx[maxn],w,fa[maxn][maxn];
8+
ll map[maxn][maxn],dis[maxn][maxn],ans=inf;
9+
void floyd()
10+
{
11+
ll he;
12+
for(int k=1;k<=n;k++)
13+
{
14+
for(int i=1;i<k;i++)for(int j=i+1;j<k;j++)
15+
{
16+
he=dis[i][j]+map[j][k]+map[k][i];
17+
if(he<ans)
18+
{
19+
ans=he;w=0;int a=j;
20+
while(a!=i){xx[++w]=a;a=fa[i][a];}
21+
xx[++w]=i;xx[++w]=k;
22+
}
23+
}
24+
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
25+
{
26+
he=dis[i][k]+dis[k][j];
27+
if(he<dis[i][j])
28+
{
29+
dis[i][j]=he;
30+
fa[i][j]=fa[k][j];
31+
}
32+
}
33+
}
34+
}
35+
int main()
36+
{
37+
// freopen("trip7.in","r",stdin);
38+
scanf("%d%d",&n,&m);int a,b;ll c;
39+
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
40+
{
41+
map[i][j]=dis[i][j]=inf;
42+
fa[i][j]=i;
43+
}
44+
for(int i=1;i<=m;i++)
45+
{
46+
scanf("%d%d%lld",&a,&b,&c);c=min(c,dis[a][b]);
47+
dis[a][b]=dis[b][a]=c;
48+
map[a][b]=map[b][a]=dis[a][b];
49+
}
50+
floyd();
51+
if(ans==inf)
52+
{
53+
printf("No solution.\n");
54+
return 0;
55+
}
56+
for(int i=1;i<=w;i++)printf("%d ",xx[i]);
57+
return 0;
58+
}

【模板】manacher算法.cpp

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include<cstdio>
2+
#include<algorithm>
3+
#include<cstring>
4+
using namespace std;
5+
const int maxn=11e6+10;
6+
char str[maxn],strr[maxn<<1];
7+
int n;
8+
int len[maxn<<1];
9+
int main()
10+
{
11+
scanf("%s",str);
12+
n=strlen(str);
13+
strr[0]='@';
14+
for(int i=0;i<=n;i++)
15+
{
16+
strr[(i<<1)+2]=str[i];
17+
strr[(i<<1)+1]='#';
18+
}
19+
int mx=0,ans=0,mid=0;
20+
for(int i=1;i<=(n<<1)+2;i++)
21+
{
22+
len[i]=(mx>i ? min(mx-i,len[mid*2-i]):1);
23+
while(strr[i-len[i]]==strr[i+len[i]]) len[i]++;
24+
if(i+len[i]>mx)
25+
{
26+
mx=len[i]+i;
27+
mid=i;
28+
}
29+
ans=max(ans,len[i]);
30+
}
31+
printf("%d",ans-1);
32+
return 0;
33+
}

0 commit comments

Comments
 (0)