萌新求助,TLE80卡不过去了/kk
查看原帖
萌新求助,TLE80卡不过去了/kk
171487
cmll02楼主2021/3/29 18:32

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
#include <unordered_map>
#include <map>
#define int long long
inline int read()
{
    int num=0,f=1;char c=getchar();
    while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
    while(c>47&&c<58)num=(num<<3)+(num<<1)+(c^48),c=getchar();
    return num*f;
}
inline int min(int a,int b){return a<b?a:b;}
char a[3005],b[3005];
std::unordered_map<unsigned long long,bool>  hash;
int suf[26][3005];
inline int ins(int x)
{
    if(hash[x-191]){return 0;}
    hash[x-191]=1;
    //puts("hey");
    return 1;
}
signed main()
{
    int n=read();
    scanf("%s%s",a,b);
    for(int i=0;i<n;i++)a[i]-=97;
    for(int i=0;i<n;i++)b[i]-=97;
    for(int i=0;i<26;i++)suf[i][n]=-1;
    for(int i=n-1;i>=0;i--)
    {
        for(int j=0;j<26;j++)
        {
            if(a[i]==j)suf[j][i]=i;
            else suf[j][i]=suf[j][i+1];
        }
    }
    int ans=0;
    for(int i=0;i<n;i++)
    {
        unsigned int has=0,cur=0;
        for(int j=i;j<n;j++)
        {
            has=has*53+b[j]+1;
            has;
            int f=suf[b[j]][cur];
            if(f==-1)break;
            cur=f+1;
            ans+=ins(has);
            //printf("[%lld %lld] has %lld\n",i,j,has);
        }
    }
    printf("%lld\n",ans);
}
/*
20
egebejbhcfabgegjgiig
edfbhhighajibcgfecef
*/
//I want 100.
//stO zhoukangyang Orz
//oh no
// why it only got 80??
//zhoukangyang CCCCCCCCCCCCCCCCCCCCCOrz
2021/3/29 18:32
加载中...