2017 ACM/ICPC Asia Regional Qingdao Online(SDKD 2024 Summer Training Contest J2)
C - The Dominator of Strings
题意
给定n个串,问是否有一个串包含其他所有串,有就输出这个串。
思路
如果有解,答案必定是最长串,一一比较即可。(没想到.find()就能过🤡)
代码一 .find()
点击查看代码
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
#define int long long
inline bool cmp(string a, string b)
{
    return a.length() > b.length();
}
void solve()
{
    int n;
    cin >> n;
    vector<string> v(n);
    for (int i = 0; i < n; i++)
    {
        cin >> v[i];
    }
    sort(v.begin(), v.end(), cmp); 
    for (int i = 1; i < n; i++)
    {
        if (v[0].find(v[i]) == string::npos) 
        {
            cout << "No" << endl;
            return;
        }
    }
    cout << v[0] << endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T;
    cin >> T;
    while (T--)
    {
        solve();
    }
    return 0;
}
代码二 KMP
点击查看代码
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mxn = 1e6 + 5;
int kmp_next[mxn]; 
void getNext(string s) 
{
    int i = 0, j = -1;
    kmp_next[0] = -1;
    while (i < s.length())
    {
        while (j != -1 && s[i] != s[j])
        {
            j = kmp_next[j];
        }
        if (s[++i] == s[++j])
        {
            kmp_next[i] = kmp_next[j];
        }
        else
        {
            kmp_next[i] = j;
        }
    }
}
bool kmp(string a, string b) 
{
    int i = 0, j = 0;
    getNext(a);
    while (i < b.length())
    {
        while (j != -1 && b[i] != a[j])
        {
            j = kmp_next[j];
        }
        i++;
        j++;
        if (j >= a.length())
        {
            return true;
        }
    }
    return false;
}
void solve()
{
    int n;
    cin >> n;
    vector<string> v(n);
    int p = 0, maxn = -1;
    for (int i = 0; i < n; i++)
    {
        cin >> v[i];
        if ((int)v[i].size() > maxn)
        {
            maxn = v[i].length();
            p = i;
        }
    }
    for (int i = 0; i < n; i++)
    {
        if (i == p)
        {
            continue;
        }
        if (!kmp(v[i], v[p]))
        {
            cout << "No" << endl;
            return;
        }
    }
    cout << v[p] << endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T;
    cin >> T;
    while (T--)
    {
        solve();
    }
    return 0;
}
H - Chinese Zodiac
题意
已知甲乙二人的属相(甲比乙年纪大),求二者年龄最小差值。
思路
相等差12,其他相减即差值,但甲比乙大,所以再加12取余
代码
点击查看代码
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
string s[] = { "rat","ox", "tiger", "rabbit", "dragon", "snake", "horse", "sheep", "monkey", "rooster", "dog", "pig" };
void solve()
{
	string a, b;
	cin >> a >> b;
	if (a == b)
	{
		cout << 12 << endl;
		return;
	}
	int aa = 0, bb = 0;
	for (int i = 0; i < 12; i++)
	{
		if (a == s[i])
		{
			aa = i;
		}
		if (b == s[i])
		{
			bb = i;
		}
	}
	cout << (bb - aa + 12) % 12 << endl;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int T = 1;
	cin >> T;
	while (T--)
	{
		solve();
	}
	return 0;
}
K - A Cubic number and A Cubic Number
题意
给定质数\(p\),问是否存在正整数a与b使得\(a^3-b^3 = p\)。
思路
立方差公式:\(a^3-b^3 = (a-b)(a^2+ab+b^2)\),由于\(p\)是质数,因子只有\(1\)和它本身,显然\((a^2+ab+b^2)\)不可能是\(1\),故\(a-b=1\),a和b相邻,数据不大直接枚举。
代码
点击查看代码
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
void solve()
{
	int p;
	cin >> p;
	for (int a = 1; a <= 1e6; a++) // p到1e12枚举到1e6就够
	{
		int b = a + 1;
		int t = a * a + a * b + b * b;
		if (t == p)
		{
			cout << "YES" << endl;
			return;
		}
	}
	cout << "NO" << endl;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int T = 1;
	cin >> T;
	while (T--)
	{
		solve();
	}
	return 0;
}
I - Smallest Minimum Cut
题意
思路
代码
点击查看代码

                
            
        
浙公网安备 33010602011771号