http://hihocoder.com/problemset/problem/
#1870 : Jin Yong’s Wukong Ranking List
我是每加1个点就dfs判断1次。
正解是拓扑排序。。。
1 #include <cstdio>
2 #include <cstdlib>
3 #include <ctime>
4 #include <cstring>
5 #include <string>
6 #include <map>
7 #include <set>
8 #include <list>
9 #include <queue>
10 #include <vector>
11 #include <bitset>
12 #include <algorithm>
13 #include <iostream>
14 using namespace std;
15 const int maxn=50;
16
17 bool vis[maxn];
18 char str[maxn][maxn],a[maxn],b[maxn],result1[maxn],result2[maxn];
19 vector<int>e[maxn];
20 int r;
21
22 void dfs(int d)
23 {
24 vector<int>::iterator j;
25 vis[d]=1;
26 for (j=e[d].begin();j!=e[d].end();j++)
27 if (!vis[*j])
28 dfs(*j);
29 else
30 {
31 r=1;
32 return;
33 }
34 }
35
36 int main()
37 {
38 int n,i,j,k,g;
39 while (~scanf("%d",&n))
40 {
41 for (i=1;i<=2*n;i++)
42 e[i].clear();
43 g=0;
44 r=0;
45 for (i=1;i<=n;i++)
46 {
47 scanf("%s%s",a,b);
48 for (j=1;j<=g;j++)
49 if (strcmp(str[j],a)==0)
50 break;
51 if (j==g+1)
52 {
53 g++;
54 strcpy(str[g],a);
55 }
56
57 for (k=1;k<=g;k++)
58 if (strcmp(str[k],b)==0)
59 break;
60 if (k==g+1)
61 {
62 g++;
63 strcpy(str[g],b);
64 }
65
66 e[j].push_back(k);
67
68 memset(vis,0,sizeof(vis));
69 if (r==0)
70 {
71 dfs(k);
72 if (r==1)
73 {
74 strcpy(result1,a);
75 strcpy(result2,b);
76 }
77 }
78 }
79
80 if (r==0)
81 printf("0\n");
82 else
83 printf("%s %s\n",result1,result2);
84 }
85 return 0;
86 }
#1871 : Heshen's Account Book
把所有内容放入字符串里,再判断。
挺多细节要考虑的,代码下方有自己编的若干数据。
1 #include <cstdio>
2 #include <cstdlib>
3 #include <ctime>
4 #include <cstring>
5 #include <string>
6 #include <map>
7 #include <set>
8 #include <list>
9 #include <queue>
10 #include <vector>
11 #include <bitset>
12 #include <algorithm>
13 #include <iostream>
14 using namespace std;
15 const int maxn=2e5;
16 const int maxsinlen=20;
17 const int maxlen=1e3+10;
18 const int maxtotallen=3e5;
19 const int maxline=2e2+10;
20
21 char num[maxn][maxsinlen];
22 char str[maxtotallen],s[maxlen],c;
23 int gx[maxline];
24
25 int main()
26 {
27 int g=0,len,line=0,ind=0,pos=0,i,j,k;
28 bool vis=1;
29 strcpy(str,"");
30 while (gets(s))
31 {
32 strcat(str,s);
33 strcat(str,"\n");
34 }
35 len=strlen(str);
36
37 for (i=0;i<len;i++)
38 {
39 if (str[i]=='\n')
40 {
41 line++;
42 if (i==0 || str[i-1]<'0' || str[i-1]>'9' || str[i+1]<'0' || str[i+1]>'9')
43 {
44 if (vis && i>ind)
45 {
46 // strncpy(num[g++],str+ind,i-ind);
47 ///delete ' ','\n'
48 k=0;
49 for (j=ind;j<i;j++)
50 if (str[j]>='0' && str[j]<='9')
51 num[g][k++]=str[j];
52 num[g][k]=0;
53 if (!(k>1 && num[g][0]=='0'))
54 {
55 g++;
56 gx[pos]++;
57 }
58 }
59 vis=1;
60 ind=i+1;
61 pos=line;
62 }
63 }
64 else if (str[i]==' ')
65 {
66 if (vis && i>ind)
67 {
68 // strncpy(num[g++],str+ind,i-ind);
69 ///delete ' ','\n'
70 k=0;
71 for (j=ind;j<i;j++)
72 if (str[j]>='0' && str[j]<='9')
73 num[g][k++]=str[j];
74 num[g][k]=0;
75 if (!(k>1 && num[g][0]=='0'))
76 {
77 g++;
78 gx[pos]++;
79 }
80 }
81 vis=1;
82 ind=i+1;
83 pos=line;
84 }
85 else
86 {
87 if (str[i]<'0' || str[i]>'9')
88 vis=0;
89 }
90 }
91
92 if (g>=1)
93 printf("%s",num[0]);
94 for (i=1;i<g;i++)
95 printf(" %s",num[i]);
96 printf("\n");
97
98 for (i=0;i<line;i++)
99 printf("%d\n",gx[i]);
100 return 0;
101 }
102 /**
103 12
104 34
105 56
106 78
107 900
108
109 ---
110
111 003
112 004
113 005
114 1 006 a
115
116 ---
117 '''
118
119 23 123
120 123 123
121
122
123
124 adssa q3qe
125 qw 1
126 qw123
127 12
128
129
130 '''
131
132 ---
133
134 1234
135 123
136
137 ---
138
139 1234
140 12 34
141
142 ---
143
144
145 1
146
147 2
148
149 3
150
151 as
152
153 4
154
155 ---
156
157 12
158 3
159 4
160 5a
161
162
163
164 ---
165
166 00
167
168 ---
169
170 0
171
172 ---
173
174 0
175 12
176
177 ---
178
179 0
180 12asdb
181
182 ---
183
184 '''
185 0
186 a
187 0 0 0 0
188
189 12 0 01 100 10 01 0
190 0
191
192 '''
193
194 **/
#1873 : Frog and Portal
重现赛时,看错题了,难受。
告诫自己:比赛时,一定要认真读题,认真分析数据!

1 #include <cstdio>
2 #include <cstdlib>
3 #include <ctime>
4 #include <cstring>
5 #include <string>
6 #include <map>
7 #include <set>
8 #include <list>
9 #include <queue>
10 #include <vector>
11 #include <bitset>
12 #include <algorithm>
13 #include <iostream>
14 using namespace std;
15 #define ll long long
16 const int maxn=1e3+10;
17
18 struct node
19 {
20 int x,y;
21 }f[300];
22
23 int shu[300],w;
24
25 void cal(ll n)
26 {
27 if (n==0)
28 w=0;
29 else
30 {
31 cal(n>>1);
32 shu[++w]=n & 1;
33 }
34 }
35
36 int main()
37 {
38 ll n;
39 int g,i,j,k;
40 while (~scanf("%lld",&n))
41 {
42 w=0;
43 cal(n);
44
45 g=0;
46 j=1;
47 k=70;
48
49 for (i=2;i<=w;i++)
50 {
51 ///(k+1)->(k+2)
52 f[++g]={k+1,k+2};
53 if (shu[i])
54 {
55 f[++g]={j,k+2};
56 j+=2;
57 }
58 k+=2;
59 }
60 f[++g]={k,199};
61 f[++g]={j,70};
62 f[++g]={j+1,j+1};
63 if (n==0)
64 f[++g]={199,199};
65
66 printf("%d\n",g);
67 for (i=1;i<=g;i++)
68 printf("%d %d\n",f[i].x,f[i].y);
69 }
70 return 0;
71 }
72 /*
73 0
74 1
75 2
76 3
77 4
78
79 4294967296
80 4294967295
81 4294967294
82
83 */
#1878 : Palindromes
找规律。
Java TLE了,难受!
关于字符串的处理,以后别用Java写。。。
1 #include <cstdio>
2 #include <cstdlib>
3 #include <ctime>
4 #include <cstring>
5 #include <string>
6 #include <map>
7 #include <set>
8 #include <list>
9 #include <queue>
10 #include <vector>
11 #include <bitset>
12 #include <algorithm>
13 #include <iostream>
14 using namespace std;
15 const int maxn=1e6+10;
16
17 int shu[maxn],ori[maxn];
18 char str[maxn];
19
20 int main()
21 {
22 int t,len,i;
23 scanf("%d",&t);
24 while (t--)
25 {
26 scanf("%s",str);
27 len=strlen(str);
28 for (i=1;i<=len;i++)
29 shu[i]=str[len-i]-48;
30 if (str[0]>'1')
31 {
32 ///odd
33 for (i=1;i<=len-1;i++)
34 ori[i]=0;
35 ori[len]=2;
36
37 for (i=1;i<=len;i++)
38 {
39 shu[i]-=ori[i];
40 if (shu[i]<0)
41 {
42 shu[i]+=10;
43 shu[i+1]--;
44 }
45 }
46
47 printf("%c",shu[len]+1+48);
48 for (i=len-1;i>=1;i--)
49 printf("%c",shu[i]+48);
50 if (len>1)
51 {
52 for (i=2;i<=len-1;i++)
53 printf("%c",shu[i]+48);
54 printf("%c",shu[len]+1+48);
55 }
56 printf("\n");
57 }
58 else if (len==1)
59 printf("0\n");
60 else if (str[1]=='0')
61 {
62 ///odd
63 for (i=1;i<=len-2;i++)
64 ori[i]=0;
65 ori[len-1]=2;
66
67 for (i=1;i<=len;i++)
68 {
69 shu[i]-=ori[i];
70 if (shu[i]<0)
71 {
72 shu[i]+=10;
73 shu[i+1]--;
74 }
75 }
76
77 printf("%c",shu[len-1]+1+48);
78 for (i=len-2;i>=1;i--)
79 printf("%c",shu[i]+48);
80 if (len-1>1)
81 {
82 for (i=2;i<=len-2;i++)
83 printf("%c",shu[i]+48);
84 printf("%c",shu[len-1]+1+48);
85 }
86 printf("\n");
87 }
88 else
89 {
90 ///even
91 for (i=1;i<=len-2;i++)
92 ori[i]=0;
93 ori[len-1]=1;
94 ori[len]=1;
95
96 for (i=1;i<=len;i++)
97 {
98 shu[i]-=ori[i];
99 if (shu[i]<0)
100 {
101 shu[i]+=10;
102 shu[i+1]--;
103 }
104 }
105
106 printf("%c",shu[len-1]+1+48);
107 for (i=len-2;i>=1;i--)
108 printf("%c",shu[i]+48);
109 for (i=1;i<=len-2;i++)
110 printf("%c",shu[i]+48);
111 printf("%c",shu[len-1]+1+48);
112 printf("\n");
113 }
114 }
115 return 0;
116 }
#1877 : Approximate Matching
得到所有与串S相似(相等)的串,组成一颗树,AC自动机,预处理每个节点遇到'0','1'到达的节点。
统计每个点在某一个位置出现的次数,每次每个点遇到'0','1',到达新的节点。
当到达叶子节点(某一个串的终止位置)时,总结果加上 该点的出现次数*2^k(k为还没确定的位置数目),同时,该节点的出现次数设置为0(以后再不出现)。
1 #include <bits/stdc++.h>
2 using namespace std;
3 #define ll long long
4 #define minv 1e-6
5 #define inf 1e9
6 #define pi 3.1415926536
7 #define nl 2.7182818284
8 const ll mod=1e9+7;//998244353
9 const int maxn=1e5+10;
10
11 ///at most 40 strings, each string contain 40 characters
12
13 struct node
14 {
15 int c,en;
16 ll v[2];
17 node *pre;
18 node *next[2];
19 node *fail;
20 node *num[2];
21 };
22
23 ll er[50];
24 char str[50];
25 queue<node*> q;
26
27 int main()
28 {
29 node *tr,*pos,*be,*p,*d;
30 int n,m,x,y,t,i,j,k,c;
31 ll result;
32 er[0]=1;
33 for (i=1;i<=40;i++)
34 er[i]=er[i-1]<<1;
35
36 scanf("%d",&t);
37 while (t--)
38 {
39 scanf("%d%d",&n,&m);
40 scanf("%s",str);
41 if (n>m)
42 {
43 printf("0\n");
44 continue;
45 }
46 tr=(node*) malloc (sizeof(node));
47 for (i=0;i<2;i++)
48 tr->next[i]=NULL;
49 tr->en=0,tr->v[0]=0,tr->v[1]=0;
50
51 for (i=0;i<=n;i++)
52 {
53 if (i!=n)
54 str[i]=(str[i]=='0')?'1':'0';
55
56 pos=tr;
57 for (j=0;j<n;j++)
58 {
59 c=str[j]-48;
60 if (pos->next[c])
61 pos=pos->next[c];
62 else
63 {
64 p=(node*) malloc (sizeof(node));
65 for (k=0;k<2;k++)
66 p->next[k]=NULL;
67 p->en=0,p->v[0]=0,p->v[1]=0;
68 p->c=c;
69
70 pos->next[c]=p;
71 p->pre=pos;
72 pos=p;
73 }
74 }
75 pos->en=1;
76
77 if (i!=n)
78 str[i]=(str[i]=='0')?'1':'0';
79 }
80
81 be=(node*) malloc (sizeof(node));
82 for (i=0;i<2;i++)
83 be->next[i]=tr;
84 tr->pre=be;
85 tr->num[0]=tr,tr->num[1]=tr;///???
86
87 ///长度相等,不用不停fail判断是否存在拥有结尾标志的点
88 q.push(tr);
89 while (!q.empty())
90 {
91 d=q.front();
92 q.pop();
93 if (d==tr)
94 d->fail=be;
95 else
96 {
97 pos=d->pre->fail;
98 c=d->c;
99 while (pos->next[c]==NULL)
100 pos=pos->fail;
101 d->fail=pos->next[c];
102
103 for (j=0;j<2;j++)
104 if (d->fail->next[j])
105 d->num[j]=d->fail->next[j];
106 else
107 d->num[j]=d->fail->num[j];
108 }
109 for (j=0;j<2;j++)
110 if (d->next[j])
111 q.push(d->next[j]);
112 }
113
114 result=0;
115 x=0,y=1;
116 tr->v[0]=1;
117 for (i=1;i<=m;i++)
118 {
119 q.push(tr);
120 while (!q.empty())
121 {
122 d=q.front();
123 for (j=0;j<2;j++)
124 if (d->next[j])
125 d->next[j]->v[y]+=d->v[x];
126 else
127 d->num[j]->v[y]+=d->v[x];
128 q.pop();
129 for (j=0;j<2;j++)
130 if (d->next[j])
131 q.push(d->next[j]);
132 }
133
134 q.push(tr);
135 while (!q.empty())
136 {
137 d=q.front();
138 // printf("%d ",d->v[y]);
139 d->v[x]=0;
140 if (d->en==1)
141 {
142 result+=d->v[y]*er[m-i];
143 d->v[y]=0;
144 }
145 q.pop();
146 for (j=0;j<2;j++)
147 if (d->next[j])
148 q.push(d->next[j]);
149 }
150 // printf("\n");
151
152 x=x^1,y=y^1;
153 }
154 printf("%lld\n",result);
155 }
156 return 0;
157 }
来源:https://www.cnblogs.com/cmyg/p/9965712.html