Compare commits

..

4 Commits

Author SHA1 Message Date
197e613574 feat: 添加字符串哈希处理功能
实现基于Z算法的字符串哈希处理,用于计算特定模式的出现次数和统计字符出现奇偶性。包含输入处理、Z数组计算和结果统计逻辑。
2025-11-05 19:02:08 +08:00
f67a1ebcb3 fix(P3953): 修复DFS逻辑错误并添加调试输出
修复DFS函数中节点1的处理逻辑,调整nk的比较运算符,并添加printf调试输出
优化solve函数中dp数组的初始化范围
2025-11-05 18:37:07 +08:00
5cb2778d2c feat(P3953): 实现基于DFS的路径计数算法替代BFS
用DFS加记忆化搜索替换原有的BFS实现,解决大规模数据下的性能问题
新增距离数组d和动态规划数组dp来优化计算
添加反向图re支持逆向搜索
处理路径计数中的环检测和边界条件
2025-11-05 16:17:11 +08:00
a788926d44 feat: 添加P3953.cpp实现最短路径计数功能
实现了一个基于Dijkstra算法的最短路径计数解决方案,用于计算在给定约束条件下从起点到终点的路径数量。包含输入处理、最短路径计算和路径计数逻辑。当路径步数超过阈值时返回-1,否则返回路径数模p的结果。
2025-11-05 14:18:47 +08:00
2 changed files with 173 additions and 0 deletions

130
src/11/5/P3953.cpp Normal file
View 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
View 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;
}