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 }
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 }
T3