mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-12-20 06:01:43 +00:00
Compare commits
4 Commits
8aeb58ec32
...
197e613574
| Author | SHA1 | Date | |
|---|---|---|---|
| 197e613574 | |||
| f67a1ebcb3 | |||
| 5cb2778d2c | |||
| a788926d44 |
130
src/11/5/P3953.cpp
Normal file
130
src/11/5/P3953.cpp
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
#include <bitset>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <deque>
|
||||||
|
#include <iostream>
|
||||||
|
#include <istream>
|
||||||
|
#include <queue>
|
||||||
|
#include <vector>
|
||||||
|
using ll = int64_t;
|
||||||
|
#define sl static inline
|
||||||
|
#define printf
|
||||||
|
const ll maxm=2e5+5,inf=1e9+7;
|
||||||
|
ll n,m,k,p,nt,d[maxm],dp[maxm][57];
|
||||||
|
bool isn,vis[maxm][57];
|
||||||
|
struct E{
|
||||||
|
ll v,w;
|
||||||
|
};
|
||||||
|
struct P{
|
||||||
|
ll now,step;
|
||||||
|
inline bool operator<(const P&o)const{
|
||||||
|
return step>o.step;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
std::vector<std::vector<E>> edg,re;
|
||||||
|
std::deque<P>dq;
|
||||||
|
|
||||||
|
sl ll dj(){
|
||||||
|
for(ll i=1;i<=n;i++){
|
||||||
|
d[i]=inf;
|
||||||
|
}
|
||||||
|
std::priority_queue<P> pq;
|
||||||
|
pq.emplace(1,0);
|
||||||
|
while(pq.size()){
|
||||||
|
auto[now,step]=pq.top();
|
||||||
|
// printf("dj now=%lld, step=%lld\n",now,step);
|
||||||
|
pq.pop();
|
||||||
|
if(step>=d[now])continue;
|
||||||
|
d[now]=step;
|
||||||
|
for(auto[v,w]:edg[now]){
|
||||||
|
pq.emplace(v,step+w);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("d[]:");
|
||||||
|
for(ll i=1;i<=n;i++){
|
||||||
|
printf("%lld ",d[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
return d[n]==inf?-1:d[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
sl ll dfs(ll u,ll k){
|
||||||
|
if(k<0||k>::k)return 0;
|
||||||
|
if(vis[u][k]){
|
||||||
|
isn=true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(dp[u][k]!=-1){
|
||||||
|
printf("dp[%lld][%lld]=%lld, in temp\n",u,k,dp[u][k]);
|
||||||
|
return dp[u][k];
|
||||||
|
}
|
||||||
|
vis[u][k]=true;
|
||||||
|
ll nans=0;
|
||||||
|
for(auto[v,w]:re[u]){
|
||||||
|
ll nk=d[u]+k-d[v]-w;
|
||||||
|
if(nk<0||nk>::k)continue;
|
||||||
|
nans=(nans+dfs(v, nk))%p;
|
||||||
|
if(isn){
|
||||||
|
vis[u][k]=false;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(u==1){
|
||||||
|
const ll ret= k==0?1:0;
|
||||||
|
printf("dp[%lld][%lld]=%lld u==1\n",u,k,ret);
|
||||||
|
nans=ret;
|
||||||
|
}
|
||||||
|
vis[u][k]=false;
|
||||||
|
printf("dp[%lld][%lld]=%lld\n",u,k,nans);
|
||||||
|
return dp[u][k]=nans;
|
||||||
|
}
|
||||||
|
|
||||||
|
sl void solve(){
|
||||||
|
printf("NT = %lld\n",++nt);
|
||||||
|
std::cin>>n>>m>>k>>p;
|
||||||
|
isn=false;
|
||||||
|
edg.clear();
|
||||||
|
edg.resize(n+1);
|
||||||
|
re.clear();
|
||||||
|
re.resize(n+1);
|
||||||
|
for(ll i=1;i<=n;i++){
|
||||||
|
for(ll j=0;j<=k;j++){
|
||||||
|
dp[i][j]=-1;
|
||||||
|
vis[i][j]=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(ll i=1;i<=m;i++){
|
||||||
|
ll u,v,w;
|
||||||
|
std::cin>>u>>v>>w;
|
||||||
|
edg[u].emplace_back(v,w);
|
||||||
|
re[v].emplace_back(u,w);
|
||||||
|
}
|
||||||
|
const ll d = dj();
|
||||||
|
printf("found d=%lld\n",d);
|
||||||
|
if(d==-1){
|
||||||
|
std::cout<<"0\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// const ll ms=d+k;
|
||||||
|
ll ans=0;
|
||||||
|
for(ll i=0;i<=k;i++){
|
||||||
|
printf("DFS i=%lld----\n",i);
|
||||||
|
ans=(ans+dfs(n,i))%p;
|
||||||
|
if(isn){
|
||||||
|
std::cout<<"-1\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::cout<<ans<<"\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
std::iostream::sync_with_stdio(false);
|
||||||
|
std::cin.tie(nullptr);
|
||||||
|
|
||||||
|
ll t;
|
||||||
|
std::cin>>t;
|
||||||
|
while(t--){
|
||||||
|
solve();
|
||||||
|
}
|
||||||
|
}
|
||||||
43
src/11/5/qzhash.cpp
Normal file
43
src/11/5/qzhash.cpp
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#include<bits/stdc++.h>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long ll;
|
||||||
|
int T,n,Z[2001000],cnt1[30],cnt2[30],sum[30],CN,BN,nown,sumn,nown2;
|
||||||
|
ll res;
|
||||||
|
char s[2001000];
|
||||||
|
int main(){
|
||||||
|
// freopen("string.in","r",stdin);
|
||||||
|
// freopen("string.out","w",stdout);
|
||||||
|
scanf("%d",&T);
|
||||||
|
while(T--){
|
||||||
|
scanf("%s",s),n=strlen(s),memset(sum,0,sizeof(sum)),memset(cnt1,0,sizeof(cnt1)),memset(cnt2,0,sizeof(cnt2)),res=CN=BN=0;
|
||||||
|
for(int i=0;i<n;i++)cnt1[s[i]-'a']^=1;
|
||||||
|
for(int i=0;i<26;i++)CN+=cnt1[i];
|
||||||
|
int Centre=-1,Rpos=-1;
|
||||||
|
for(int i=1;i<n;i++){
|
||||||
|
if(i<=Rpos)Z[i]=min(Z[i-Centre],Rpos-i+1);
|
||||||
|
else Z[i]=0;
|
||||||
|
while(i+Z[i]<n&&s[Z[i]]==s[i+Z[i]])Z[i]++;
|
||||||
|
if(i+Z[i]>Rpos)Centre=i,Rpos=i+Z[i]-1;
|
||||||
|
}
|
||||||
|
// for(int i=1;i<n;i++)printf("%d ",Z[i]);puts("");
|
||||||
|
nown=CN,nown2=sumn=0;
|
||||||
|
for(int i=1;i<n;i++){
|
||||||
|
if(cnt1[s[i-1]-'a'])sumn-=sum[nown--];
|
||||||
|
else sumn+=sum[++nown];
|
||||||
|
cnt1[s[i-1]-'a']^=1;
|
||||||
|
int tot=min(Z[i],n-i-1)/i+1;
|
||||||
|
int N1=(tot+1)>>1,N2=(tot)>>1;
|
||||||
|
// printf("%d:%d %d\n",tot,N1,N2);
|
||||||
|
res+=1ll*sumn*N1;
|
||||||
|
if(cnt2[s[i-1]-'a'])nown2--;
|
||||||
|
else nown2++;
|
||||||
|
cnt2[s[i-1]-'a']^=1;
|
||||||
|
sum[nown2]++;
|
||||||
|
if(nown2<=nown)sumn++;
|
||||||
|
res+=1ll*BN*N2;
|
||||||
|
if(nown2<=CN)BN++;
|
||||||
|
}
|
||||||
|
printf("%lld\n",res);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user