模拟8题解

T1

kmp模板,求next数组,加上求f数组的或特判

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn=200005;
 6 char a[2*maxn],b[maxn],add[2];
 7 int nxt[maxn],len;
 8 void kmp()
 9 {
10     nxt[1]=0;
11     for(int i=2,j=0;i<=len;i++){
12         while(j>0&&b[i]!=b[j+1])j=nxt[j];
13         if(b[i]==b[j+1])j++;
14         nxt[i]=j;
15     }
16 }
17 int main()
18 {
19     int T;
20     scanf("%d",&T);
21     while(T--)
22     {
23         int la,lb;
24         scanf("%d%d%s%s",&la,&lb,a+1,add);
25         for(int i=1;i<=lb;i++)
26             b[i]=a[i];
27         len=lb+1;
28         b[len]=add[0];
29         if(len<=la&&b[len]==a[len])
30             printf("%d\n",len);
31         else{
32             memset(nxt,0,sizeof nxt);
33             kmp();
34             printf("%d\n",nxt[len]);
35         }
36     }
37 }
View Code

T2

tarjan先缩点成V-DCC,将割点单独拿出来,但是有的路可以不走

所以在新图上跑一边dfs,标记是否可以到达n,

然后对于可以的,还要看是不是1或n,这个判断不要提前进行,对于之前的缩点不做任何修改

比如,若之前进行如下操作:

tarjan(1);
tot=cnt;
for(int i=2;i<n;i++)
	 if(cut[i])bl[i]=++tot;

 则对于1是割点的情况,bl[1]=0,会对接下来的dfs会产生影响

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<vector>
  5 #define R register
  6 using namespace std;
  7 const int maxn=1000005;
  8 int read()
  9 {
 10     int f=1,x=0;char ch=getchar();
 11     while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
 12     while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
 13     return f*x;
 14 }
 15 int n,m,cn;
 16 struct node1{
 17     int u,v,nxt;
 18 }e1[4*maxn];int h1[maxn],nu1;
 19 void add1(R int x,R int y)
 20 {
 21     e1[++nu1].u=x;
 22     e1[nu1].v=y;
 23     e1[nu1].nxt=h1[x];
 24     h1[x]=nu1;
 25 }
 26 struct node{
 27     int u,v,nxt;
 28 }e[4*maxn];int h[maxn],nu;
 29 void add(R int x,R int y)
 30 {
 31     e[++nu].u=x;
 32     e[nu].v=y;
 33     e[nu].nxt=h[x];
 34     h[x]=nu;
 35 }
 36 int dfn[maxn],low[maxn],num,tot,vis[maxn],ca[maxn];
 37 int cut[maxn],sta[maxn],top,cnt,bl[maxn];
 38 vector<int>dcc[maxn];
 39 void tarjan(R int x)
 40 {
 41     dfn[x]=low[x]=++num;
 42     sta[++top]=x;
 43     R int flag=0;
 44     for(R int i=h1[x];i;i=e1[i].nxt)
 45     {
 46         R int y=e1[i].v;
 47         if(!dfn[y])
 48         {
 49             tarjan(y);
 50             low[x]=min(low[x],low[y]);
 51             if(dfn[x]<=low[y])
 52             {
 53                 flag++;
 54                 if(x!=1||flag>1)cut[x]=1;
 55                 cnt++;
 56                 int z;
 57                 do{
 58                     z=sta[top--];
 59                     dcc[cnt].push_back(z);
 60                 }while(z!=y);
 61                 dcc[cnt].push_back(x);//!!!
 62             }
 63         }
 64         else low[x]=min(dfn[y],low[x]);
 65     }
 66 }
 67 int dfs(R int x)
 68 {
 69     vis[x]=1;
 70     if(x==bl[n])return 1;
 71     R int flag=0;
 72     for(R int i=h[x];i;i=e[i].nxt)
 73     {
 74         R int y=e[i].v;
 75         if(vis[y])continue;
 76         if(dfs(y))flag=1;
 77     }
 78     if(flag==1&&x>cnt&&x!=bl[1]&&x!=bl[n])
 79         cn++,ca[x]=1;
 80     return flag;
 81 }
 82 void init()
 83 {
 84     nu1=nu=num=cn=top=cnt=tot=0;
 85     memset(dcc,0,sizeof dcc);
 86     memset(h,0,sizeof h);
 87     memset(e,0,sizeof e);
 88     memset(h1,0,sizeof h1);
 89     memset(e1,0,sizeof e1);
 90     memset(dfn,0,sizeof dfn);
 91     memset(low,0,sizeof low);
 92     memset(cut,0,sizeof cut);
 93     memset(vis,0,sizeof vis);
 94     memset(sta,0,sizeof sta);
 95     memset(bl,0,sizeof bl);
 96     memset(ca,0,sizeof ca);
 97 }
 98 int main()
 99 {
100     R int T=read();
101     while(T--)
102     {
103         init();
104         n=read(),m=read();
105         for(R int i=1;i<=m;++i)
106         {
107             R int x=read(),y=read();
108             if(x!=y)add1(x,y),add1(y,x);
109         }
110         tarjan(1);
111         tot=cnt;
112         for(int i=1;i<=n;i++)
113             if(cut[i])    
114                 bl[i]=++tot;
115         for(int i=1;i<=cnt;i++)
116             for(int j=0;j<dcc[i].size();j++){
117                 int x=dcc[i][j];
118                 if(cut[x]) 
119                     add(i,bl[x]),
120                     add(bl[x],i);
121                 else bl[x]=i;
122             }
123         dfs(bl[1]);
124         printf("%d\n",cn);
125         if(cn!=0)
126             for(R int i=1;i<=n;++i)
127                 if(ca[bl[i]])
128                     printf("%d ",i);
129         puts("");
130     }
131 }
View Code

T3

猜你喜欢

转载自www.cnblogs.com/casun547/p/11249485.html
今日推荐