最后一次NOIP模拟了·····

题目1:回文数字

  Tom 最近在研究回文数字。
  假设 s[i] 是长度为 i 的回文数个数(不含前导0),则对于给定的正整数 n 有:

  aaarticlea/png;base64,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" alt="" />

  以上等式中最后面的括号是布尔表达式,Tom 想知道S[n] mod 233333 的值是多少。

  输入格式

  第一行一个正整数 T 。
  接下来输出共 T 行,每行一个正整数 n 。

  输出格式

  输出共 T 行,每行一个整数,表示 S[n] mod 233333 。  

  样例数据 1

  输入  [复制]


2  

  输出

9

  备注

  【数据规模与约定】
  对于 30% 的数据:n≤5。
  对于另 20% 的数据:∑n≤10^7。
  对于另 20% 的数据:T=1。
  对于 100% 的数据:T≤5*10^5;n≤10^9。

  

  根据题意可以推出来就是一个差比数列·····用快速幂和逆元(中间有除法)求解即可

  然而考试的时候作死cout<<endl直接超时····下次输出换行一定要用cout<<"\n“·····

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const long long mod=;
const long long niyuan=;
long long a,T;
inline long long R(){
char c;long long f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f;
}
inline long long ksm(long long a,long long b){
long long ans=;a%=mod;
while(b){
if(b&) ans=ans*a%mod;
b/=;a=a*a%mod;
}
return ans;
}
int main(){
//freopen("bug.in","r",stdin);
//freopen("bug.out","w",stdout);
T=R();
while(T--){
a=R();
if(a==||a==) cout<<""<<endl;
else{
a=(a-)/;
long long b=ksm(,a+);long long c=b;
b=b*((*a%mod+)%mod)%mod;
c=(c-)*niyuan%mod*%mod;
b=((b--c)%mod+mod)%mod;
cout<<b<<"\n";
}
}
return ;
}

题目2:路径统计

  一个 n 个点 m 条边的无重边无自环的无向图,点有点权,边有边权,定义一条路径的权值为路径经过的点权的最大值乘边权最大值。
  求任意两点间的权值最小的路径的权值。

  输入格式

  第一行两个整数 n ,m ,分别表示无向图的点数和边数。
  第二行 n 个正整数,第 i 个正整数表示点i的点权。
  接下来 m 行每行三个正整数 ui,vi,wi ,分别描述一条边的两个端点和边权。

  输出格式

  输出 n 行,每行 n 个整数。
  第 i 行第 j 个整数表示从 i 到 j 的路径的最小权值;如果从 i 不能到达 j ,则该值为 -1 。特别地,当 i=j 时输出 0 。

  样例数据 1

  输入  [复制]

3 3 
2 3 3 
1 2 2 
2 3 3 
1 3 1

  输出

0 6 3 
6 0 6 
3 6 0

  备注

  【样例输入输出2】
     见选手目录下path.in/path.ans。

  【数据范围与约定】
  对于 20% 的数据:n≤5;m≤8。
  对于 50% 的数据:n≤50。
  对于 100% 的数据:n≤500;m≤n*(n-1)/2,边权和点权不超过10^9 。

  考虑直接用floyd的话会出现错误···比如说我们用k1更新f[i][j]后,下次用k2更新f[i][j]时可能会出错····

  方法是我们将每个点的点权从小到大排序··在枚举最外层的中转点时我们按升序枚举···这样就能保证正确性,具体怎么证明这里就不多写了···

  注意能开int的地方就开int··不然要超时

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cctype>
using namespace std;
const int N=;
struct node{
int val,id;
}p[N];
int n,m,mp[N][N],val[N],me[N][N];
long long dis[N][N];
bool Visit[N],jud[N][N];
inline int R(){
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f;
}
inline long long Rl(){
char c;long long f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f;
}
int buf[];
inline void write(long long x){
if(!x){putchar('');return ;}
if(x<){putchar('-');x=-x;}
while(x){buf[++buf[]]=x%,x/=;}
while(buf[]) putchar(buf[buf[]--]+);
return ;
}
inline bool cmp(const node &a,const node &b){
return a.val<b.val;
}
int main(){
//freopen("path.in","r",stdin);
///freopen("path1.out","w",stdout);
n=R();m=R();
int a,b;long long c;
memset(jud,false,sizeof(jud));
for(int i=;i<=n;i++)
for(int j=;j<=n;j++) mp[i][j]=me[i][j]=1e+,dis[i][j]=2e+;
for(int i=;i<=n;i++) val[i]=R(),p[i].val=val[i],p[i].id=i;
sort(p+,p++n,cmp);
for(int i=;i<=m;i++){
a=R(),b=R(),c=R();me[a][b]=me[b][a]=c;
mp[a][b]=mp[b][a]=max(val[a],val[b]);jud[a][b]=jud[b][a]=true;dis[a][b]=dis[b][a]=(long long)mp[b][a]*me[b][a];
}
for(int K=;K<=n;K++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
int k=p[K].id;
if(!jud[i][k]||!jud[k][j]||i==j) continue;
int maxp=max(mp[i][k],mp[k][j]);
int maxe=max(me[i][k],me[k][j]);
if((long long)maxp*maxe<dis[i][j]){
dis[i][j]=(long long)maxp*maxe;
mp[i][j]=maxp;me[i][j]=maxe;
jud[i][j]=true;
}
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(i==j) write(),putchar(' ');
else if(jud[i][j]) write(dis[i][j]),putchar(' ');
else write(-),putchar(' ');
}
putchar('\n');
}
return ; }

题目3:字符串

  给定两个字符串 s1 和 s2 ,两个字符串都由 26 个小写字母中的部分字母构成。现在需要统计 s2 在 s1 中出现了的次数。

  对于 s1 中的每个位置 i ,设 strlen(s2)=m ,若:

  aaarticlea/png;base64,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" alt="" />

  (最外层中括号为布尔表达式)

  则认为 s2 在 s1 的 i 处出现了一次,现在想知道,s2 在 s1 中一共出现了多少次?

  输入格式

  第一行为一个字符串 s1 ;
  第二行为一个字符串 s2 ;
  第三行为一个整数 k 。

  输出格式

  输出一行一个整数,表示 s2 在 s1 中出现的次数。

  样例数据 1

  输入  [复制]

ababbab 
aba 
1

  输出

3

  备注

  【数据范围与约定】
  前 10% 的数据:n>m。
  前 30% 的数据:n,m≤1000。
  对于另 40% 的数据:k≤20。
  对于 100% 的数据:n≤200000;m≤100000;k≤100。

  由于正解要用到后缀数组不属于NOIP范围··所以这里我就先挖个坑吧··只讲讲70分

  暴力肯定是枚举每一个起始位置暴力匹配···70分算法就是它的优化··每次匹配的时候我们用hash+二分来匹配即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+;
const int base=;
int n,m,ans=,k;
unsigned long long bt[N],hash1[N],hash2[N];
char s1[N],s2[N];
inline void pre(){
bt[]=;for(int i=;i<=n;i++) bt[i]=bt[i-]*base;
for(int i=n;i>=;i--) hash1[i]=hash1[i+]*base+s1[i]-'a';
for(int i=m;i>=;i--) hash2[i]=hash2[i+]*base+s2[i]-'a';
}
inline int getans(int st){
int cnt=,po=;
while(cnt<=k&&po<=m){
int le=,ri=m-po;
while(le<=ri){
int mid=(ri+le)/;
if((hash2[po]-hash2[po+mid+]*bt[mid+])==(hash1[st+po-]-hash1[st+po+mid]*bt[mid+])) le=mid+;
else ri=mid-;
}
if(po+ri!=m) cnt++;po=po+ri+;
}
if(cnt<=k) return ;
else return ;
}
int main(){
//freopen("a.in","r",stdin);
scanf("%s%s",s1+,s2+);
scanf("%d",&k);
n=strlen(s1+);m=strlen(s2+);
pre();
for(int i=;i<=n-m+;i++) ans+=getans(i);
cout<<ans<<"\n";
return ;
}

最新文章

  1. 关于el jstl
  2. 利用background-attachment做视差滚动效果
  3. Dividing 多重背包 倍增DP
  4. 防止vuejs在解析时出现闪烁
  5. Gridview实现银行选择列表
  6. css_day7
  7. Linux NFS服务器的安装与配置(转载)
  8. B+树介绍
  9. GBDT和XGBOOST算法原理
  10. JVM基础系列第15讲:JDK性能监控命令
  11. 三十分钟学会 Less
  12. PY序
  13. 22.QT-QXmlStreamReader解析,QXmlStreamWriter写入
  14. Topshelf:一款非常好用的 Windows 服务开发框架 转发https://www.cnblogs.com/happyframework/p/3601995.html
  15. 【LOJ#6060】Set(线性基)
  16. Linux: HowTo See Directory Tree Structure
  17. Memcached分布式缓存快速入门
  18. Oracle:使用nginx做为代理访问
  19. 自定义xadmin后台首页
  20. 使用 jfreechart 生成 曲线、柱状图、饼状图、分布图 展示到JSP

热门文章

  1. js jquery 权限单选 bug修改以及正确代码 购物车数量加减
  2. sql的使用
  3. SQLSERVER存储过程基本语法使用
  4. v-cloak
  5. dts--framework(二)
  6. java 二进制、位运算、和移位运算符(2013-07-30-bd 写的日志迁移
  7. Codeforces Round #449 (Div. 2) C. DFS
  8. 如何在一个顶级域名下用两个二级域名访问vps下的两个项目网站--完美解决骗
  9. centos 服务器内存管理 服务于端口状态
  10. 《Cracking the Coding Interview》——第16章:线程与锁——题目4