[Z-Trening-718][BALKAN OI 2009]Reading

2023-12-07 07:19
文章标签 718 2009 oi reading trening balkan

本文主要是介绍[Z-Trening-718][BALKAN OI 2009]Reading,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Q1 : 邻接矩阵只能限制边数 怎么控制路径长度呢?

A : 把路径长度转换为多条边 每个点虚拟为五个

Q2 : 怎么统计长度小于N的点的和呢?

A :虚拟一个空字符 他与任意真实字符距离为1 这样我们可以自然的构造一些开头是空字符的单词 比如"__AA" 这个单词开头有两个空字符 总体相异度为4


还有就是此题特别卡常数 其实我是没过的 用了1700+ms才过

题目可以直接在Vjudge上看 只是测不了


#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
#define MAXN 131
#define MAXM 131
#define MAXF 26
typedef int LL;
struct Matrix{  int n, m;  LL A[MAXN+10][MAXN+10];  
}E, Z, A, D, B;
bool vis[MAXN+10][MAXN+10];
LL Map[MAXN+10][MAXN+10];
int m;
LL K;
const int p = 1000000007;
void init(Matrix &X)  
{  X.n = X.m = 0;  memset(X.A, 0, sizeof(X.A));  
}  
void Get_E()  
{  memset(E.A, 0, sizeof(E.A));E.n = E.m = MAXN;  for(int i = 0; i < E.n; i++)   E.A[i][i] = 1;  
}  
void mul(Matrix AA, Matrix BB, Matrix &Ans)  
{  Matrix D;  init(D);  Ans.n = D.n = AA.n;  Ans.m = D.m = BB.m;  for(int i = 0; i < MAXN; i++)  for(int j = 0; j < MAXN; j++)  for(int k = 0; k < MAXN; k++)  {  D.A[i][k] += ((long long)AA.A[i][j] * BB.A[j][k]) % p;  if(D.A[i][k] > p)D.A[i][k] -= p;  }  memcpy(Ans.A, D.A, sizeof(D.A));  
}  
void pow_mod(Matrix A, LL k, Matrix &Ans)  
{  Matrix t = A;  E.n = A.n;  E.m = A.m;  while(k)  {  if(k & 1) mul(E, t, E);mul(t, t, t);  k >>= 1;  }  memcpy(Ans.A, E.A, sizeof(E.A));  
}  
int main()
{Get_E();cin >> K >> m;char c;c = getchar();while(c !='\n' ) c=getchar();for(int i = 1; i <= 26; i++)for(int d = 4; d >= 1; d--)Map[i+26*d][i+26*(d-1)] = 1;for(int i = 0; i < m; i++){char s[10];fgets(s, 10, stdin);int u = s[0] - 'a' + 1, v = s[2] - 'a' + 1, d = s[4] - '0';Map[u][v+26*(d-1)] = 1;Map[v][u+26*(d-1)] = 1;vis[u][v] = vis[v][u] = true;}for(int i = 1; i <= 26; i++)for(int j = i; j <= 26; j++)if(!vis[i][j])Map[i][j] = Map[j][i] = 1;for(int i = 0; i <= 26; i++) Map[0][i]++;LL ans = 0;memcpy(B.A, Map, sizeof(B.A));B.m = B.n = MAXN;pow_mod(B, K, A);for(int i = 0; i <= 26; i++)for(int j = 1; j <= 26; j++){ans += A.A[i][j];if(ans > p)ans %= p;}ans %= p;cout << ans;
}
/*
1 1
a b 2
*/


这篇关于[Z-Trening-718][BALKAN OI 2009]Reading的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/464975

相关文章

【系统架构设计师-2009年】综合知识-答案及详解

更多内容请见: 备考系统架构设计师-核心总结索引 文章目录 【第1题】【第2~4题】【第5题】【第6题】【第7~8题】【第9~10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第21题】【第22题】【第23题】【第24题】【第25~26题】【第27~28题】【第29~30题】【第31题】【第32~33题】

【HDU】4990 Reading comprehension 等比数列:两层快速幂

传送门:【HDU】4990 Reading comprehension 题目分析:首先根据题目意思可以很容易找到一个等比数列: 当n%2==1时,f(n) = 1 + 2^2 + 2^4 + ... + 2^(n-1) 当n%2==0时,f(n) = 2*f(n-1)。 接下来可以构造矩阵用矩阵快速幂求,也可以像我一样用两层快速幂求。(比赛的时候没想到用矩阵快速幂= =) 当n%2

九度考研真题 浙大 2009-1浙大1031:xxx定律

//1031:xxx定律 #include<iostream> using namespace std; int main(){ int n; while(cin>>n&&n!=0){ int num=0; while(n!=1){ if(n%2==0){ n/=2; num++; } else{ n=3*n+1; n/

代码随想录算法训练营四十二天|300.最长递增子序列、674.最长连续递增则序列、718.最长重复子数组

题目链接:300. 最长递增子序列 - 力扣(LeetCode) 思路:如果nums[i] > nums[j] 那么dp[i] 要么是dp[i] 要么是dp[j] + 1 class Solution(object):def lengthOfLIS(self, nums):""":type nums: List[int]:rtype: int"""dp = [1] * len(nums)for

SAT阅读练习题:Reading Comprehension Test 3

SAT阅读练习题:Reading Comprehension Test 3   10 minutes - 7 questions   The passage is taken from a biography of Florence Nightingale who is mainly remembered for her heroic work as a nurse during the

SAT阅读练习题:Reading Comprehension Test 2

SAT阅读:Reading Comprehension Test 2   10 minutes - 7 questions   The passage is taken from a description of the life of certain Pacific Islanders written by a pioneering sociologist.   By the time

Lost connection to MySQL server at 'reading initial communication packet', system error: 0

连接MySQL提示: ERROR 2013 (HY000): Lost connection to MySQL server at ‘reading initial communication packet’, system error: 0 这是由于库文件初始化连接MySQL时连接失败引起的。 导致此错误的原因有: 1.服务器为正常启动的; 2.mysql设置文件中“bind-address”

腾讯公司后台服务器经典面试题 (2009年5月)

转自http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1484141&page=1 前些时间去了腾讯面试, 可惜现场没回答好。 是一些基础问题,同时也比较深入的问题。 在此列出来, 欢迎大家讨论交流。 提问(不按时间顺序): 1, 使用Linux epoll模型,水平触发模式(Level-Triggered);当socket可写

Rust: Reading and Writing Files

Reading and Writing Files We need some way to actually get data from the filesystem so we can process it, and write it back when we’re done 我们需要某种方法从文件系统中实际获取数据,以便处理它,并在完成后将其写回来 use std::fs; std::f

杭电 acm 2009

求数列的和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 42988    Accepted Submission(s): 26574 Problem Description 数列的定义如