ABC 285 ABCD
https://atcoder.jp/contests/abc285/tasks
A - Edge Checker 2
题目大意:
二叉树,给定两个数字,问其中一个是否和另一个数字直接连线?也即是是否是父节点?
Sample Input 1
1 2
Sample Output 1
Yes
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=1000200,M=4002;
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
//cin>>T;
while(T--)
{
LL x,y;
cin>>x>>y;
if(x==y/2||x/2==y) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
B - Longest Uncommon Prefix
题目大意:
给定长度为n的字符串S,从1到n,i为间隔个数,求S[k]!=S[k+i],一旦==立即停止.
Sample Input 1
6
abcbac
Sample Output 1
5
1
2
0
1
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=1000200,M=4002;
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
//cin>>T;
while(T--)
{
LL n;
cin>>n;
string s;
cin>>s;
s=" "+s;
for(int i=1;i<n;i++)
{
LL sum=0;
for(int l=1,r=1+i;r<=n;l++,r++)
{
//cout<<s[l]<<" "<<s[r]<<endl;
if(s[l]!=s[r]) sum++;
else break;
}
cout<<sum<<endl;
}
}
return 0;
}
C - abc285_brutmhyhiizp
题目大意:
A-z为1-26,AA27 AB28~ 给定一个字符串问表示的数字是多少?
Sample Input 3
BRUTMHYHIIZP
Sample Output 3
10000000000000000
从后往前依次计算,每一个字母根据位置所在都可以有26的i次方种搭配
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=1000200,M=4002;
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
//cin>>T;
while(T--)
{
string s;
cin>>s;
reverse(s.begin(),s.end());
map<char,LL> mp;
for(int i=65;i<=90;i++)
{
mp[(char)i]=i-64;
}
LL sum=0;
for(int i=0;i<s.size();i++)
{
if(i==0) sum+=mp[s[i]];
else sum+=(LL)pow(26,i)*(mp[s[i]]);
}
cout<<sum<<endl;
}
return 0;
}
D - Change Usernames
题目大意:
左边的网名想换成右边的网名,但是注意网名不能重复,问是否能够全部换成功?
Sample Input 3
5
aaa bbb
yyy zzz
ccc ddd
xxx yyy
bbb ccc
Sample Output 3
Yes
感觉我的方法繁琐了一些,用了离散化,然后分别存了前一个节点和下一个节点,还附带了状态值和个数
如果实在看不懂可以换下一个
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=1000200,M=4002;
LL beg=1,ans=0,a[N],b[N],st[N],last[N];
string s[N],c[N];
vector<LL> v[N];
bool flag=true;
void dfs(LL x)
{
if(st[x]!=0||flag==false) return ;
st[x]=1;
ans--;
for(int i=0;i<v[x].size();i++)
{
if(st[v[x][i]]==0) dfs(v[x][i]);
else
{
flag=false; return ;
}
}
}
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
//cin>>T;
while(T--)
{
memset(last,0,sizeof last);
LL n;
cin>>n;
map<string,LL> mp;
for(int i=1;i<=n;i++)
{
cin>>s[i]>>c[i];
if(mp[s[i]]==0) ans++,a[i]=beg++,mp[s[i]]=a[i];
else a[i]=mp[s[i]];
if(mp[c[i]]==0) ans++,b[i]=beg++,mp[c[i]]=b[i];
else b[i]=mp[c[i]];
//cout<<a[i]<<" "<<b[i]<<endl;
v[a[i]].push_back(b[i]);
last[b[i]]=a[i];
}
for(int i=1;i<=n;i++)
{
if(last[a[i]]==0)
{
dfs(a[i]);
if(flag==false) break;
}
}
if(ans!=0||flag==false) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
return 0;
}