2020智算之道初赛第一场题解

 

A、B都是伪代码

A.排队:

是个水题吧,但是可以优化一小下:

/**
Code:
**/
read(n)
for(int i=1;i<=n;i++) read(a[i])
for(int i=1;i<=m;i++){
       if(!vis[a[i]]{
        for(int i=1;i<=n;i++){
        vis[k] = 1;
        }
    }
}
ll ans = 0;
for(int i=1;i<=n;i++){
    if(!vis[i]) ans++;
}
out(ans)

B.开关:

从后向前考虑

之后考虑用位运算进行优化

鬼知道rk1的0ms怎么来的

scanf("%s",s+1);
int cot = 0,ans = 0;
for(int i=1;i<=len;i++){
    int x = s[i]-'0';
    x^=cot;
    if(x){
        ans++;
        cot^=1;
    }    
}
out(ans)

C.字符串:

首先考虑s串在t串中的位置

所以枚举t中每个字符当作s的起始位置,那么只需要判断一下所有的字母出现次数相同即可

之后判断这个子串是否出现过,可以map 当然可以再次取余降到数组大小

最后的优化:

运用滑动窗口将其优化到O(n)

rk1这个0ms真实个鬼

Code:

/*** keep hungry and calm CoolGuang!***/
#pragma GCC optimize(2)
#include <bits/stdc++.h>
#include<iostream>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pp;
const ll INF=1e17;
const int Maxn=2e7+10;
const int maxn =2e5+10;
const int mod=998244353;
const int Mod = 1e9+7;
const double eps=1e-3;
inline bool read(ll &num)
{char in;bool IsN=false;
    in=getchar();if(in==EOF) return false;while(in!='-'&&(in<'0'||in>'9')) in=getchar();if(in=='-'){ IsN=true;num=0;}else num=in-'0';while(in=getchar(),in>='0'&&in<='9'){num*=10,num+=in-'0';}if(IsN) num=-num;return true;}
ll n,m,p;
char s[maxn],t[maxn];
ll sum[maxn][30];
int vis[30],tvis[30];
bool mp1[Maxn],mp2[Maxn];
ull H[maxn],H1[maxn];
char F[300];
inline void out(ll x){ if (x == 0) return (void) (putchar('0'));    ll tmp = x > 0 ? x : -x;    if (x < 0) putchar('-');    int cnt = 0;    while (tmp > 0) {        F[cnt++] = tmp % 10 + '0';        tmp /= 10;     }   while (cnt > 0) putchar(F[--cnt]);   printf("\n"); }
ll qpow(ll a,ll b){
    ll ans = 1;
    while(b){
        if(b&1) ans = (ans*a)%mod;
        b/=2;a = (a*a)%mod;
    }return ans;
}
int main(){
    scanf("%s%s",s+1,t+1);
    int lens = strlen(s+1),lent = strlen(t+1);
    for(register int i=1;i<=lens;i++) vis[s[i]-'a']++;
    ll temp_27 = qpow(27,lens);
    ll ans = 0;
    for(register int i=1;i<=lent;i++) H[i] = (H[i-1]*27 + (t[i]-'a'+1))%mod;
    for(int i=1;i<=lens;i++) tvis[t[i]-'a']++;
    int cot = 0;
    for(int i=0;i<26;i++) if(tvis[i] != vis[i]) cot++;
    for(register int i=lens;i<=lent;i++){
        if(!cot){
            ll tempx = (H[i] - (H[i-lens]*temp_27)%mod+mod)%mod;
            tempx %= 10000007;
            if(!mp1[tempx]){
                mp1[tempx] = true;
                ans++;
            }
        }
        tvis[t[i-lens+1]-'a']--;
        if(tvis[t[i-lens+1]-'a'] == vis[t[i-lens+1]-'a']&&tvis[t[i-lens+1]-'a']+1 != vis[t[i-lens+1]-'a']) cot--;
        if(tvis[t[i-lens+1]-'a'] != vis[t[i-lens+1]-'a']&&tvis[t[i-lens+1]-'a']+1 == vis[t[i-lens+1]-'a']) cot++;
        tvis[t[i+1]-'a']++;
        if(tvis[t[i+1]-'a'] == vis[t[i+1]-'a']&&tvis[t[i+1]-'a']-1 != vis[t[i+1]-'a']) cot--;
        if(tvis[t[i+1]-'a'] != vis[t[i+1]-'a']&&tvis[t[i+1]-'a']-1 == vis[t[i+1]-'a']) cot++;
    }
    out(ans);
    return 0;
}
/**
aab
abacabaa
**/

最后rk6..加油!

猜你喜欢

转载自blog.csdn.net/qq_43857314/article/details/107306880