2019 MIST IUPC F - Palindromadness

题解:等我知道为什么了再写。反正是个我觉得很难的回文自动机的题。

#include<bits/stdc++.h>
#define ls (x<<1)
#define rs (x<<1|1)
#define ll long long
#define pb push_back
#define mp make_pair
#define db double
#define pii pair<int,int>
using namespace std;
const int M=1e4+7;
const int N=1e6+7;
const int inf=1e9;
inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
int T;
char S[N];
ll aa[N];
int n,base,mod;
struct PAM{
	int last,tot;
	int son[N][26],len[N],fail[N],half[N],pq[N];
	ll cnt[N],val[N];
	ll ans;
	int vis[N];
	ll tmp;
	void init(){
		for(int i=0;i<=tot;i++){
			cnt[i]=len[i]=0;
		}
		for(int i=0;i<=tot;i++)for(int j=0;j<26;j++)son[i][j]=0;
		len[1]=-1;tot=1;last=0;fail[0]=fail[1]=1;
		ans=0;tmp=0;
	}
	void extend(int c,int pl,char *S){
		int p=last;int q,r;
		while(S[pl-len[p]-1]!=S[pl]){p=fail[p];}
		if(!son[p][c]){
			q=++tot,r=fail[p];
			len[q]=len[p]+2;
			while(S[pl-len[r]-1]!=S[pl])r=fail[r];
			fail[q]=son[r][c];
			son[p][c]=q;
		}
		last=son[p][c];
		cnt[last]++;
	}
	void cal(){
		for(int i=1;i<=tot;i++)pq[i]=cnt[i];
		for(int i=tot;i>=1;i--)cnt[fail[i]]+=cnt[i];
	}
	void dfs(int x){
		int sta=0;
		if(fail[x]>1&&!vis[fail[x]]){
			vis[fail[x]]=1;
			sta=1;
			tmp=(tmp+cnt[fail[x]]*aa[n-len[fail[x]]]%mod)%mod;

		}
		if(x>1&&!vis[x]){tmp=(tmp+cnt[x]*aa[n-len[x]]%mod)%mod;vis[x]=1;}
		//cout<<tmp<<" "<<cnt[x]<<" "<<aa[n-len[x]]<<"\n";
		ans=(ans+tmp*cnt[x]%mod)%mod;
		for(int i=0;i<26;i++){
			if(son[x][i])dfs(son[x][i]);
		}
		if(x>1&&vis[x])tmp=(tmp-cnt[x]*aa[n-len[x]]%mod)%mod,vis[x]=0;
		if(sta)tmp=(tmp-cnt[fail[x]]*aa[n-len[fail[x]]]%mod)%mod,vis[fail[x]]=0;
	}
}pam;

int main(){
	cin>>T;
	int cas=0;
	while(T--){
		cin>>n>>base>>mod;
		scanf("%s",S+1);
		aa[0]=1;
		int len=strlen(S+1);
		for(int i=1;i<=n;i++)aa[i]=aa[i-1]*base%mod;
		//for(int i=1;i<=n;i++)cout<<aa[i]<<" ";cout<<"\n";
		pam.init();
		for(int i=1;i<=len;i++){
			pam.extend(S[i]-‘a‘,i,S);
		}
		pam.cal();
		pam.dfs(0);
		//cout<<pam.tmp<<"\n";
		pam.dfs(1);

		//cout<<pam.cnt[0]<<pam.cnt[1]<<"\n";
		cout<<"Case "<<++cas<<": "<<(pam.ans%mod+mod)%mod<<"\n";
	}
}

  

原文地址:https://www.cnblogs.com/intwentieth/p/11618540.html

时间: 2024-11-10 03:27:07

2019 MIST IUPC F - Palindromadness的相关文章

2019 CCPC秦皇岛 F Forest Program

关键在于怎样找到各个环及其边数. dfs搜 双连通分量 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef pair<int,int> piir; 4 typedef long long ll; 5 const int maxn = 3e5+5; 6 const int maxm = 5e5+5; 7 const int INF = 0x3f3f3f3f; 8 const int mod = 998244353; 9

F#周报2019年第8期

新闻 Fable 2.2发布,支持匿名记录 Paket提升还原时间 Microsoft.Jupyter.Core预览 .NET Framework 4.8早期可访问编译版本3745 博客 使用SAFE技术栈进行服务端渲染 CNTK 102.5:在F#的Jupyter里使用Graphviz与D3可视化CNTK模型 2019年选择F#的web框架 使用SignalR与F#构建游戏 我对业界失去信任,但工具崇拜拯救了我 TensorFlow.FSharp:开发中的由F#编写的TensorFlow AP

从棋盘原点开始扔骰子,到达某一个终点的概率

棋盘上共有2020个格子,从1开始顺序编号.棋子初始放在第1格,通过扔骰子决定前进格子数,扔出x点就前进x格.骰子有6面,分别对应1至6:质量均匀.当棋子到达2014或超过2014,游戏结束.那么,棋子刚好到达2014的概率与______最接近. 2/3 1/2 1/3 2/7 1/6 1/7 最终游戏停止时停的位置是2014, 2015, 2016, 2017, 2018, 2019,利用f[i]来表示到达格子i的方法数,由于到达2014之前的每个格子概率可以看作相等,那么: f[2014]

7.1 useradd:创建用户

7.1 useradd:创建用户 1 使用useradd 常规添加用户工作原理流程 在使用useradd命令时,若不加任何参数选项,后面直接跟所添加的用户名,那么系统首先会读取/etc/login.defs(用户定义文件)和/etc/default/useradd(用户默认配置文件)文件中所定义的参数和规则,然后根据所设置的规则添加用户,同时还会向/etc/passwd(用户文件)和/etc/group(组文件)文件内添加新用户和新用户组记录,向/etc/shadow(用户密码文件)和/etc/

过分过分进货价获国家

http://f.dangdang.com/group/24554/3491082/http://f.dangdang.com/group/24554/3491087/http://f.dangdang.com/group/24554/3491094/http://f.dangdang.com/group/24554/3491099/http://f.dangdang.com/group/24554/3491105/http://f.dangdang.com/group/24554/349111

我们找个地方看好戏

http://v.qq.com/page/f/y/4/m041433ssun.html http://v.qq.com/page/f/y/4/m041433ssun.html http://v.qq.com/page/f/y/4/m04143o3lhg.html http://v.qq.com/page/f/y/4/m04144675h3.html http://v.qq.com/page/f/y/4/m04144k1k1j.html http://v.qq.com/page/f/y/4/m04

[AtCoder] NIKKEI Programming Contest 2019 (暂缺F)

[AtCoder] NIKKEI Programming Contest 2019 ??本来看见这一场的排名的画风比较正常就来补一下题,但是完全没有发现后两题的AC人数远少于我补的上一份AtCoder. A - Subscribers ??首先始终 \(max = \min(A, B)\) ,\(min\) 的话如果 \(A + B \leq N\) ,那么就是 \(0\) ,否则就是 \(A + B - N\) . int n, a, b; int main() { read(n), read

F#周报2019年第10期

新闻 .NET Core 3预览版3之宣告 .NET Core 3.0将在2019年下半年发布 .NET Standard 2.1的首个预览版 Docker与cgroup的内存限制 LambdAle 2019征文 使用TypeShape生成透镜 为什么使用Ply(F的高性能TPL类库) 当前什么IDE可以使用FSI Mac版Visual Studio 2019预览版3 Mac版Visual Studio 2019预览版发布说明 Xamarin.Forms 3.6:视觉特性已经成熟 视频及幻灯片

F#周报2019年第15期

新闻 Hedgehog新站点 Bolero 0.4发布,增加远程认证 FsToolkit.ErrorHandling与Cvdm.ErrorHandling合并了 F#里的3D图形编程与游戏开发 有趣的3D--浏览器里F# 3D绘制 F# CNTK:变分自动编码器例子--从2D隐空间生成MNIST数字 在最近两个月中ASP.NET Core 3.0有着30%的性能提升 Rider 2019.1中的单元测试改进 Rider 2019.1中macOS与Linux的代码覆盖率 耳目一新的VS Code产