AtCoder Beginner Contest 295 A-D题解
A.Probably English
1 void solve() 2 { 3 int n;cin>>n; 4 set<string>st; 5 st.insert("and"); 6 st.insert("not"); 7 st.insert("that"); 8 st.insert("the"); 9 st.insert("you"); 10 while(n--) 11 { 12 string s; 13 cin>>s; 14 if(st.count(s)) 15 { 16 cout<<"Yes"<<"\n"; 17 return; 18 } 19 } 20 cout<<"No\n"; 21 }
B.Bombs
1 void solve() 2 { 3 int n,m;cin>>n>>m; 4 for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j]; 5 for(int i=1;i<=n;i++) 6 { 7 for(int j=1;j<=m;j++) 8 { 9 if(a[i][j]>='0'&&a[i][j]<='9') 10 { 11 for(int ii=i-(a[i][j]-'0');ii<=i+(a[i][j]-'0');ii++) 12 { 13 for(int jj=j-(a[i][j]-'0');jj<=j+(a[i][j]-'0');jj++) 14 { 15 if(ii>0&&ii<=n&&jj>0&&jj<=m&&abs(i-ii)+abs(j-jj)<=(a[i][j]-'0')) 16 { 17 if(a[ii][jj]=='#')a[ii][jj]='.'; 18 } 19 } 20 } 21 a[i][j]='.'; 22 } 23 } 24 } 25 for(int i=1;i<=n;i++) 26 { 27 for(int j=1;j<=m;j++) 28 { 29 cout<<a[i][j]; 30 } 31 cout<<"\n"; 32 } 33 }
C.Socks
1 void solve() 2 { 3 int n;cin>>n; 4 set<int>st; 5 int ans=0; 6 while(n--) 7 { 8 int x;cin>>x; 9 if(st.count(x)) 10 { 11 ans++; 12 st.erase(x); 13 }else st.insert(x); 14 } 15 cout<<ans<<"\n"; 16 }
D.Three Days Ago
题意:给出一个数字字符串,问有多少个子区间能表示成一个字符串重复两次
Solution
前缀和,很明显当区间内每个数字的个数均为偶数时才成立
我们用前缀和记录下从1到i的每个数字个数,然后对于[l,r],如果l-1和r的每一个数字的奇偶性相同,那么就能保证[l,r]成立
这里用二进制的方式来表示每一位数字的状态,因为相邻的状态一定不同,所以不用判断,另外对于i=0的状态为0,要注意一下
1 int a[N][10]; 2 int b[1<<10]; 3 void solve() 4 { 5 string s;cin>>s; 6 int ans=0; 7 a[0][s[0]-'0']=1; 8 for(int i=1;i<s.length();i++) 9 { 10 for(int j=0;j<=9;j++) 11 { 12 a[i][j]=a[i-1][j]; 13 } 14 a[i][s[i]-'0']=a[i-1][s[i]-'0']+1; 15 } 16 b[0]=1; 17 for(int i=0;i<s.length();i++) 18 { 19 int res=0; 20 for(int j=0;j<=9;j++) 21 { 22 if(a[i][j]&1)res+=1; 23 if(j!=9)res<<=1; 24 } 25 26 ans+=b[res]; 27 b[res]++; 28 } 29 cout<<ans<<"\n"; 30 }

浙公网安备 33010602011771号