Compare commits

..

No commits in common. "197e613574eff6e75ace4b4cae7d8a646e7adce9" and "8aeb58ec3244f3e67cc5c6578a818fac03278fe5" have entirely different histories.

2 changed files with 0 additions and 173 deletions

View File

@ -1,130 +0,0 @@
#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();
}
}

View File

@ -1,43 +0,0 @@
#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;
}