牛客練習賽60

OI界第一麻瓜發表於2020-09-25

連結:https://ac.nowcoder.com/acm/contest/4853#question
還有幾個題如果有空就做

A

一位一位做就可以了

B

沒有三點共線的話直接考慮每條邊的貢獻就可以了

C

序列自動機建起來,然後胡亂DP一波就可以了
順便把模板丟在這裡

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
typedef long long LL;
const int N=1005;
const int MOD=1e9+7;
int add (int x,int y)   {x=x+y;return x>=MOD?x-MOD:x;}
int mul (int x,int y)   {return (LL)x*y%MOD;}
int dec (int x,int y)   {x=x-y;return x<0?x+MOD:x;}
int Pow (int x,int y)
{
 if (y==1) return x;
 int lalal=Pow(x,y>>1);
 lalal=mul(lalal,lalal);
 if (y&1) lalal=mul(lalal,x);
 return lalal;
}
struct qq
{
 int son[N][26];
 int last[N];
 int par[N];
 int tot;
 void Ins (int x)
 {
  int np=++tot;
  for (int u=0;u<26;u++)
  for (int i=last[u];i!=0&&son[i][x]==0;i=par[i])
  son[i][x]=np;
  par[np]=last[x];last[x]=np;
 }
}a;
char ss[N];
int f[2][N];
int main()
{
 int n,k;
 scanf("%d%d",&n,&k);
 scanf("%s",ss+1);
 for (int u=0;u<26;u++) a.last[u]=1;a.tot=1;
 for (int u=1;u<=n;u++) a.Ins(ss[u]-'a');
 int op=0;f[0][1]=1;
 for (int j=1;j<=k;j++)
 {
  op^=1;memset(f[op],0,sizeof(f[op]));
  for (int u=1;u<=a.tot;u++)
  {
   for (int i=0;i<26;i++)
   if (a.son[u][i]!=0)
   f[op][a.son[u][i]]=add(f[op][a.son[u][i]],f[op^1][u]);
  }
 }
 int ans=0;for (int u=1;u<=a.tot;u++) ans=add(ans,f[op][u]);
 printf("%d\n",ans);
 return 0;
}

D

E

F