吉比特4.29笔试
编程第一题 常规分解
#include<bits/stdc++.h>
using namespace std;
int main()
{
int ans=0;
for(int i=2;i*i<=n;i++)
{
while(n%i==0)
{
ans++;
n/=i;
}
}
if(n>1)
ans++;
cout<<ans<<endl;
}编程第二题 不会做 直接无脑搜了,
直接搜过了40%
加了剪枝过了80%
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
char a[50];
char b[50];
int len1,len2;
int ans=0;
ull h[50];
ull p[50];
ull base=233;
ull getl(int l,int r)
{
return h[r]-h[l-1]*p[r-l+1];
}
void dfs(int id,int now,unordered_map<char,ull>mp,unordered_map<char,int>mpp,unordered_map<ull,int>vis,unordered_map<ull,char>viss)
{
int l=now;
if(len2-now<len1-id)
return ;
if(id==len1+1&&now==len2+1)
{
ans++;
return ;
}
if(id>len1||now>len2)
return ;
if(mp[a[id]])
{
int r=l+mpp[a[id]];
if(mp[a[id]]!=getl(l,r))
return ;
dfs(id+1,r+1,mp,mpp,vis,viss);
return ;
}
for(int r=now;r<=len2;r++)
{
if(len2-r<len1-id-1)
break;
ull v=getl(l,r);
if(vis[v]&&viss[v]!=a[id])
continue;
mp[a[id]]=getl(l,r);
mpp[a[id]]=r-l;
vis[v]++;
viss[v]=a[id];
dfs(id+1,r+1,mp,mpp,vis,viss);
mp[a[id]]=0;
mpp[a[id]]=0;
vis[v]--;
}
}
int main()
{
scanf("%s",a+1);
scanf("%s",b+1);
// cin>>a+1>>b+1;
len1=strlen(a+1);
len2=strlen(b+1);
p[0]=1;
for(int i=1;i<=len2;i++)
{
p[i]=p[i-1]*base;
h[i]=h[i-1]*base+b[i];
}
unordered_map<char,ull>mp;
unordered_map<char,int>mpp;
unordered_map<ull,int>vis;
unordered_map<ull,char>viss;
dfs(1,1,mp,mpp,vis,viss);
printf("%d\n",ans);
}


京公网安备 11010502036488号