标签:一调 高二上 这次 memset int dfn low include mx
T1 匹配
分析
据说是个kmp的板子,但是我把kmp基本忘光了,所以打的哈希,然后赛后去复习了kmp。。。。
AC 代码
#include <iostream>
using namespace std;
#define ll long long
inline int in(){
int x = 0;
bool f = 0;
char c = getchar();
while(c > '9' || c < '0'){
if(c == '-') f ^= 1;
c = getchar();
}
while(c <= '9' && c >= '0'){
x = (x << 1) + (x << 3) + (c ^ 48);
c = getchar();
}
if(!f) return x;
else return -x;
}
const int N = 1e5+10;
const int mod = 1e9+7;
const int B = 233;
int t,n,m,ans;
char a[N << 1],b[N];
ll base[N];
ll qa[N];
ll qb[N];
int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
t = in();
base[0] = 1;
for(int i = 1;i < N;++i)
base[i] = base[i-1]*B%mod;
while(t--){
ans = 0;
n = in();
m = in();
m++;
scanf("%s",a+1);
qb[m+1] = 0;
for(int i = 1;i < m;++i){
b[i] = a[i];
qa[i] = (qa[i-1]*B%mod + a[i]);
}
b[m] = getchar();
b[m] = getchar();
if(m <= n) qa[m] = (qa[m-1]*B%mod + a[m]);
// for(int i = 1;i <= n;++i) printf("%lld ",qa[i]);
// printf("\n");
for(int i = m;i >= 1;--i){
qb[i] = (base[m-i]*b[i]%mod + qb[i+1])%mod;
if(qb[i] == qa[m-i+1] && m-i+1 <= n) ans = m-i+1;
}
// for(int i = 1;i <= m;++i) printf("%lld ",qb[i]);
// printf("\n");
printf("%d\n",ans);
}
return 0;
}
T2 回家
分析
一道tarjan求割点的问题,稍做处理就好了
因为要求的是$1$到$n$之间的割点,所以要判断一下
还有就是,一共$400000$条边,但是因为是无向图,所以要开$800000$的数组,smtwy就这么错的
smtwy 的不知名算法
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
typedef long long ll;
using namespace std;
const int mx=800000+5000;
//有几个割点能割开终点和起点
int T;
int num;
int head[mx];
int rt=1;
int ans;
int len,t;
int dfn[mx],low[mx];
bool vis[mx],cut[mx],vi[mx],vv[mx];
struct Node{
int from;
int to;
int next;
}e[mx];
void Insert(int u,int v){
e[++len].from=u;
e[len].to=v;
e[len].next=head[u];
head[u]=len;
}
void Tarjan(int u){
// printf("u=%d\n",u);
dfn[u]=low[u]=++num;
int son=0;
vis[u]=1;
for(int i=head[u];i!=0;i=e[i].next){
int v=e[i].to;
if(dfn[v]==0){
son++;
Tarjan(v);
if(vv[v]==1)vv[u]=1;//这样应该没问题
low[u]=min(low[u],low[v]);
// printf("v=%d u=%d low[u]=%d low[v]=%d\n",v,u,low[u],low[v]);
if(dfn[u]<=low[v]){
//u的时间戳小于v能最远到达的点
if(son>1 || u!=rt){
if(u==1)continue;
if(vi[u]==0 && vv[u]==1 && vv[v]==1){//应该问题不大
vi[u]=1;
cut[u]=1;
ans++;
}
}
}
}
else if(vis[v]==1){
low[u]=min(low[u],dfn[v]);
}
}
}
void clear(){
memset(head,0,sizeof(head));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(vis,0,sizeof(vis));
memset(vi,0,sizeof(vi));
memset(cut,0,sizeof(cut));
memset(vv,0,sizeof(vv));
for(int i=1;i<=len;++i){
e[i].from=0;
e[i].to=0;
e[i].next=0;
}
ans=0;
num=0;
len=0;
t=0;
//e应该不用
}
void Solve(){
scanf("%d",&T);
while(T--){
clear();
int n,m;
scanf("%d%d",&n,&m);
vv[n]=1;
for(int i=1;i<=m;++i){
int u,v;
scanf("%d%d",&u,&v);
Insert(u,v);
Insert(v,u);
}
Tarjan(1);
printf("%d\n",ans);
for(int i=1;i<=n;++i){
if(cut[i]==1){
printf("%d ",i);
}
}
printf("\n");
}
}
int main(){
Solve();
return 0;
}
AC 代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define ll long long
inline int in(){
int x = 0;
bool f = 0;
char c = getchar();
while(c > '9' || c < '0'){
if(c == '-') f ^= 1;
c = getchar();
}
while(c <= '9' && c >= '0'){
x = (x << 1) + (x << 3) + (c ^ 48);
c = getchar();
}
if(!f) return x;
else return -x;
}
const int N = 4e5;
int t,n,m;
int head[N],to[N << 1],nxt[N << 1],tot;
int dfn[N],low[N],tim;
int a[N],cnt;
bool gd[N];
inline void add(int u,int v){
to[++tot] = v;
nxt[tot] = head[u];
head[u] = tot;
}
inline void tarjan(int x){
if(x == n) gd[x] = 1;
dfn[x] = low[x] = ++tim;
for(int i = head[x];i;i = nxt[i]){
int y = to[i];
// printf("%d -> %d\n",x,y);
if(!dfn[y]){
tarjan(y);
low[x] = min(low[x],low[y]);
if(dfn[x] <= low[y] && x != 1 && x != n){
if(gd[y]) a[++cnt] = x;
}
if(gd[y]) gd[x] = 1;
}else low[x] = min(low[x],dfn[y]);
}
}
int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
t = in();
int x,y;
while(t--){
n = in();
m = in();
memset(head,0,sizeof(head));
memset(nxt,0,sizeof(nxt));
memset(gd,0,sizeof(gd));
memset(dfn,0,sizeof(dfn));
cnt = 0;
tot = 0;
for(int i = 1;i <= m;++i){
x = in();
y = in();
if(x != y){
add(x,y);
add(y,x);
}
}
// for(int i = 1;i <= n;++i){
// printf("%d:",i);
// for(int j = head[i];j;j = nxt[j])
// printf("%d ",to[j]);
// printf("\n");
// }
tarjan(1);
// for(int i = 1;i <= n;++i) printf("%d ",gd[i]);
// printf("\n");
// for(int i = 1;i <= cnt;++i) printf("%d ",a[i]);
// printf("\n");
printf("%d\n",cnt);
sort(a+1,a+cnt+1);
for(int i = 1;i <= cnt;++i) printf("%d ",a[i]);
printf("\n");
}
return 0;
}
T3 寿司
分析
标签:一调,高二上,这次,memset,int,dfn,low,include,mx 来源: https://www.cnblogs.com/Kamisato-Ayaka/p/16460130.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。