7.25T1T2•水题

两道水题,都贼惨,难受。。。。。。。一大把伤心往事以及蒟蒻的自己,今天上午的我,绝对像个zz

T1

emm,KMP,hash任您挑选,当然我忘了KMP怎么玩,就去打了hash,就这想式子还想了半天,不过点和长度之间的转换最后还是被我玩死了,没倒腾对,不过我最后还是hash过的,hash的话就O(n)长度扫一遍就行了,完全可以作为hash模板题,还是我废物啊,别的就没啥可说的了,注意一下小的细节就可以了

 1 #include<cstdio>
 2 #include<string>
 3 #include<cstring>
 4 #include<iostream>
 5 #define ull unsigned long long
 6 #define p 131
 7 #define maxn 200100
 8 using namespace std;
 9 int t,lena,lenb,maxxx;
10 char a[maxn*2],b[maxn*2];
11 ull mi[maxn*2],hasha[maxn*2],hashb[maxn*2];
12 void clear()
13 {
14     maxxx=0;  memset(hasha,0,sizeof(hasha));  memset(hashb,0,sizeof(hashb));
15 }
16 int main()
17 {
18     scanf("%d",&t);  mi[0]=1;
19     for(int i=1;i<=maxn*2;++i)  mi[i]=mi[i-1]*p;
20     while(t--)
21     {
22         clear();
23         scanf("%d%d%s",&lena,&lenb,a+1);
24         for(int i=1;i<=lenb;++i)  b[i]=a[i];
25         scanf("%s",&b[++lenb]);
26         for(int i=1;i<=lena;++i)  hasha[i]=hasha[i-1]*p+a[i]-'a'+1;
27         for(int i=1;i<=lenb;++i)  hashb[i]=hashb[i-1]*p+b[i]-'a'+1;
28         if(lenb<=lena&&hashb[lenb]==hasha[lenb])  maxxx=lenb;
29         for(int i=1;i<=min(lena,lenb);++i)
30         {
31             ull bijiao=hashb[lenb]-hashb[lenb-i]*mi[i];
32             if(bijiao==hasha[i])  maxxx=max(maxxx,i);
33         }
34         printf("%d\n",maxxx);
35     }
36     return 0;
37 }
暴力出奇迹

T2

好好读题,多画样例,仔细思考,别跟我似的,想着啥是啥,打完就扔,我是废物,太废物了,这道题,乍一看给你一种打板子求割点就是正解的错觉,事实上坑还是在的,就是从1到n的必经点肯定是割点,但不见得割点就是必经点,因为有可能从1到n某些割点根本就不需要经过,所以这题你给他点双缩点,然后dfs从1跑到n,标记一下途中经过的割点,那些割点就是最终答案了,记得数组稍微开大一点,记请缩点前后的对应关系就没问题了

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<vector>
  4 #include<stack>
  5 #include<cstring>
  6 #define maxn 200100
  7 #define maxm 400100
  8 using namespace std;
  9 int T,n,m,js,root,tot,cnt,num,j,ans;
 10 int head[maxn],to[maxm*2],xia[maxm*2];
 11 int dfn[maxn],low[maxn],cut[maxn];
 12 int bh[maxn],ss[maxn];
 13 int h[maxn*2],t[maxm*2],x[maxm*2];
 14 int pd[maxn*2],ys[maxn*2];
 15 vector <int> ds[maxn*2];
 16 stack <int> s;
 17 void clear()
 18 {
 19     js=0;  root=0;  tot=0;  num=0;  j=0;  ans=0;
 20     while(s.empty()==false)  s.pop();
 21     for(int i=1;i<=cnt;++i)  ds[i].clear();
 22     memset(head,0,sizeof(head));  memset(to,0,sizeof(to));
 23     memset(xia,0,sizeof(xia));  memset(dfn,0,sizeof(dfn));
 24     memset(low,0,sizeof(low));  memset(cut,0,sizeof(cut));
 25     memset(bh,0,sizeof(bh));  memset(ss,0,sizeof(ss));
 26     memset(h,0,sizeof(h));  memset(t,0,sizeof(t));  memset(x,0,sizeof(x));
 27     memset(pd,0,sizeof(pd));  memset(ys,0,sizeof(ys));
 28     cnt=0;
 29 }
 30 void add(int x,int y)
 31 {
 32     to[++js]=y;  xia[js]=head[x];  head[x]=js;
 33 }
 34 void tarjan(int x)
 35 {
 36     int bj=0;  dfn[x]=low[x]=++tot;  s.push(x);
 37     if(x==root&&head[x]==0)  {ds[++cnt].push_back(x);  return ;}
 38     for(int i=head[x];i;i=xia[i])
 39     {
 40         int ls=to[i];
 41         if(dfn[ls]==0)
 42         {
 43             tarjan(ls);  low[x]=min(low[x],low[ls]);
 44             if(low[ls]>=dfn[x])
 45             {
 46                 bj++;
 47                 if(x!=root||bj>=2)  cut[x]=1;
 48                 int y;  cnt++;
 49                 do  {y=s.top();  s.pop();  ds[cnt].push_back(y);}
 50                 while(y!=ls);
 51                 ds[cnt].push_back(x);
 52             }
 53         }
 54         else  low[x]=min(low[x],dfn[ls]);
 55     }
 56 }
 57 void ADD(int a,int b)
 58 {
 59     t[++j]=b;  x[j]=h[a];  h[a]=j;
 60 }
 61 void dfs(int w)
 62 {
 63     ys[w]=1;
 64     if(pd[w]==1)  return ;
 65     for(int i=h[w];i;i=x[i])
 66     {
 67         int ls=t[i];
 68         if(ys[ls]==0)
 69         {    
 70             dfs(ls);
 71             if(pd[ls]==1)  pd[w]=1;
 72         }
 73     }
 74 }
 75 int main()
 76 {
 77     scanf("%d",&T);
 78     while(T--)
 79     {
 80         scanf("%d%d",&n,&m);
 81         for(int i=1;i<=m;++i)
 82         {
 83             int u,v;  scanf("%d%d",&u,&v);
 84             add(u,v);  add(v,u);
 85         }
 86         for(int i=1;i<=n;++i)
 87             if(dfn[i]==0)  {root=i;  tarjan(i);}
 88         num=cnt;
 89         for(int i=1;i<=n;++i)
 90             if(cut[i]==1)  bh[i]=++num;
 91         for(int i=1;i<=cnt;++i)
 92             for(int j=0;j<ds[i].size();++j)
 93             {
 94                 int ls=ds[i][j];
 95                 if(cut[ls]==1)  {ADD(i,bh[ls]);  ADD(bh[ls],i);}
 96                 else  ss[ls]=i;
 97             }
 98         if(cut[n]==1)  pd[bh[n]]=1;
 99         else  pd[ss[n]]=1;
100         if(cut[1]==1)  dfs(bh[1]);
101         else  dfs(ss[1]);
102         for(int i=2;i<n;++i)
103         {
104             int ls;
105             if(cut[i]==1)  ls=bh[i];
106             else  ls=ss[i];  
107             if(pd[ls]==1&&cut[i]==1)  ans++;
108         }
109         printf("%d\n",ans);
110         for(int i=2;i<n;++i)
111         {
112             int ls;
113             if(cut[i]==1)  ls=bh[i];
114             else  ls=ss[i];  
115             if(pd[ls]==1&&cut[i]==1)  printf("%d ",i);
116         }
117         puts("");  clear();
118     }
119     return 0;
120 }
模板出奇迹

猜你喜欢

转载自www.cnblogs.com/hzjuruo/p/11246465.html