杭电多校(五)2019.08.05--暑假集训

【HDU 6624】


【HDU 6625】


【HDU 6626】


【HDU 6627】


【HDU 6628】


【HDU 6629】

【题目大意】求一个字符串每个后缀和字符串的最长前缀长度的和

【解决思路】扩展KMP裸题(居然卡cin,cout     qwq)

#include<cstdio>
#include<string>
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int MAXN = 1000010;
int z[MAXN];
ll query(string s) {
    ll ans = 0;
    int n = (int)s.length();
    for (int i = 1, l = 0, r = 0; i < n; ++i) {
        if (i <= r) z[i] = min(r - i + 1, z[i - l]);
        while (i + z[i] < n && s[z[i]] == s[i + z[i]]) ++z[i];
        if (i + z[i] - 1 > r) l = i, r = i + z[i] - 1;
    }
    for (int i = 1; i < n; i++)
    {
        if (z[i] == 0)
            ans++;
        else
        {
            if (z[i] + i == n)
                ans += z[i];
            else
                ans += z[i] + 1;
        }

        //printf("%d  ", z[i]);
    }
    return ans;
}
string s;
int main()
{
    int T;
    ios_base::sync_with_stdio(0);
    cin >> T;
    while (T--)
    {
        cin >> s;
        memset(z, 0, sizeof(z));
        cout<< query(s)<<'\n';
    }
    return 0;
}
View Code

【HDU 6630】

 【题目大意】给定N,x,y,令x在第一位,y在最后一位,中间数字排列相邻数字绝对值之差不大于2,输出有多少种排列方式

 【解决思路】x和y之间的数字一定会移到最底然后移到最上,再移到y,中间的部分会由向上移3格或移1格确定,所以就可以对答案进行递推

递推式如下:dp[i]=dp[i-1]=dp[i-3]

#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iterator>
#include<algorithm>
const int maxn = 1e5 + 10;
long long dp[maxn];
int main()
{
    using namespace std;
    int T;
    cin >> T;
    while (T--)
    {
        int N, x, y;
        cin >> N >> x >> y;
        if (x > y)
            swap(x, y);
        for (int i = x - 5; i <= x + 5; i++)
        {
            if (i < 0)
                continue;
            dp[i] = 0;
        }
        if (x == 1)
        {
            dp[x] = 1;
            for (int i = x + 1; i <= y; i++)
            {
                if (i - 3 < 0)
                    dp[i] = dp[i - 1];
                else
                    dp[i] = (dp[i - 1] + dp[i - 3]) % 998244353;
            }
        }
        else
        {
            dp[x + 1] = 1;
            for (int i = x + 2; i <= y; i++)
            {
                dp[i] = (dp[i - 1] + dp[i - 3]) % 998244353;
            }
        }
        if (y == N)
            cout << dp[y] << "\n";
        else
            cout << dp[y - 1] << "\n";
    }
}
View Code

【HDU 6631】


【HDU 6632】


【HDU 6633】

猜你喜欢

转载自www.cnblogs.com/rentu/p/11304887.html