【FZU2280】Magic
题意
给出n个字符串,每个字符串有一个权值wi 有q个操作,操作有两种 1 x y 将字符串x的权值变为y 2 x 查询操作,输出以字符串x为后缀,且权值小于等于wx的字符串个数。其中n<=1000 每个字符串长度<=1000 询问q<=80000。
分析
n并不大,但是q太大了。如果暴力的话,每次查询都是o(n*len)的,肯定不行。
等等,谁说不行?我试试 emmm。。。爆过去了????下面是瞎几把爆的代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std;
const int maxn=+;
int len[maxn],w[maxn];
char s[maxn][maxn];
int T,n,q; int main(){
scanf("%d",&T);
for(int t=;t<=T;t++){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%s",s[i]);
scanf("%d",&w[i]);
len[i]=strlen(s[i]);
}
scanf("%d",&q);
int opt;
for(int i=;i<=q;i++){
scanf("%d",&opt);
if(opt==){
int x,y;
scanf("%d%d",&x,&y);
w[x]=y;
}else if(opt==){
int x;
scanf("%d",&x);
int ans=;
for(int j=;j<=n;j++){
if(w[j]>w[x])continue;
if(len[j]<len[x])continue;
bool ok=;
for(int k=len[j]-,l=len[x]-;l>=;k--,l--){
if(s[x][l]!=s[j][k]){
ok=;
break;
}
}
if(ok){
ans++;
// cout<<j<<endl;
}
}
printf("%d\n",ans);
}
}
}
return ;
}
好吧好吧,上面那个不算,我们重新来想···
后缀嘛,后缀数组?咳,我就知道名字而已不会。。想点会的。。
字典树行不行?我们只要把字符串倒着插进去就可以用统计前缀的方法来统计后缀了。
w这个限制怎么办?
我们在字典树上每一个字符串结尾维护一个vector···这样··时间复杂度是多少?均摊下应该是···可以的···吧?
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int maxn=+;
int ch[maxn*maxn][],W[maxn];
char s[maxn][maxn];
int val[maxn*maxn];
vector<int>G[maxn*maxn];
int T,n,q,sz;
void insert(char *s,int w){
int len=strlen(s);
int u=;
for(int i=;i<len;i++){
int id=s[i]-'a';
if(!ch[u][id]){
ch[u][id]=++sz;
}
u=ch[u][id];
}
G[u].push_back(w);
return ;
}
void tra(int u){
/* if(G[u].size()!=0){
for(int i=0;i<G[u].size();i++){
printf("%d ",G[u][i]);
}
return;
}*/
for(int i=;i<;i++){
if(ch[u][i]){
printf("%c",i+'a');
tra(ch[u][i]);
}
}
return;
}
int ans;
void check(int u,int k){
if(G[u].size()){
for(int i=;i<G[u].size();i++){
if(W[G[u][i]]<=W[k]){
ans++;
}
}
}
for(int i=;i<;i++){
if(ch[u][i])
check(ch[u][i],k);
}
return;
}
void solve(int k){
int u=;
ans=;
for(int i=strlen(s[k])-;i>=;i--){
int id=s[k][i]-'a';
if(!ch[u][id]){
return ;
}
u=ch[u][id];
}
check(u,k);
return ;
}
int main(){
scanf("%d",&T);
for(int t=;t<=T;t++){
scanf("%d",&n);
for(int i=;i<=*;i++)G[i].clear();
memset(val,,sizeof(val));
memset(ch,,sizeof(ch));
sz=;
char s1[maxn];
int x;
for(int i=;i<=n;i++){
scanf("%s%d",s[i],&W[i]);
for(int j=;j<strlen(s[i]);j++){
s1[j]=s[i][strlen(s[i])--j];
}
s1[strlen(s[i])]='\0';
insert(s1,i);
}
// tra(0); scanf("%d",&q);
for(int i=;i<=q;i++){
int opt;
scanf("%d",&opt);
if(opt==){
int x,y;
scanf("%d%d",&x,&y);
W[x]=y;
}else if(opt==){
int x;
scanf("%d",&x);
solve(x);
printf("%d\n",ans);
}
}
}
return ;
}
【FZU2280】Magic的更多相关文章
- 【POJ2888】Magic Bracelet Burnside引理+欧拉函数+矩阵乘法
[POJ2888]Magic Bracelet 题意:一个长度为n的项链,有m种颜色的珠子,有k个限制(a,b)表示颜色为a的珠子和颜色为b的珠子不能相邻,求用m种珠子能串成的项链有多少种.如果一个项 ...
- 【CF878D】Magic Breeding bitset
[CF878D]Magic Breeding 题意:有k个物品,每个物品有n项属性值,第i个人的第j个属性值为aij,有q个操作: 1 x y 用x和y合成一个新的物品,新物品的编号是++k,新物品的 ...
- 【CF628D】Magic Numbers 数位DP
[CF628D]Magic Numbers 题意:求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数(这里的偶数位是的是从高位往低位数的偶数位).$a,b<10^{2 ...
- 【hihocoder】 Magic Box
题目1 : Magic Box 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 The circus clown Sunny has a magic box. When ...
- 【CF1110E】 Magic Stones - 差分
题面 Grigory has n n magic stones, conveniently numbered from \(1\) to \(n\). The charge of the \(i\)- ...
- 【CF632F】Magic Matrix(生成树 脑洞)
题目链接 大意 给定一个\(N\times N\)的矩阵,问是否满足以下三个条件: \(A_{i,i}=0\) \(A_{i,j}=A_{j,i}\) 对于任意的\(i,j,k\),满足\(A_{i, ...
- 【xsy1232】Magic 最小割
题目大意:给你一个$n$个点,$m$条有向边的图,每个点有一个点权$a_i$,同时你可以用$b_i$的代价将$a_i$变为$0$ 另外你要付出$\sum\limits_{i=1}^n\max\limi ...
- 【ZOJ4061】Magic Multiplication(构造)
题意:定义一个新运算为两个数A,B上每一位相乘,然后顺次接在一起,现在给定结果C和原来两个数字的长度,要求恢复成原来的数字A,B 若有多解输出A字典序最小的,A相同输出B字典序最小的,无解输出Impo ...
- 【Codeforces1117C_CF1117C】Magic Ship(构造)
题目: Codeforces1117C 考的时候很困,开局半小时后才过A,只做出来AB,排名3000+,掉了119--半夜体验极差. 翻译: 你是一个船长.最初你在点 \((x_1,y_1)\) (显 ...
随机推荐
- python 爬虫的一些使用技巧
1.最基本的抓站 import urllib2 content = urllib2.urlopen('http://XXXX').read() -2.使用代理服务器这在某些情况下比较有用,比如IP被封 ...
- spring Bean配置的三种形式
Spring Bean配置有以下三种形式: 传统的xml配置 Spring 2.5 以后新增注解配置 Spring3.0以后新增JavaConfig 1. 传统的xml配置 <?xml vers ...
- 类数组对象:arguments
在js中调用一个函数的时候,我们经常会给这个函数传递一些参数,js把传入到这个函数的全部参数存储在一个叫做arguments的东西里面,那它到底是什么呢? 一.描述 arguments 是一个对应于传 ...
- 关于djangoadmin的一个博客
http://www.cnblogs.com/linxiyue/category/569717.html
- Collections排序
0.前言 ThreeSet的底层实现是红黑树,它在创建set的过程中实现排序.Collections.sort是在对整个集合进行排序,按道理来说使用TreeSet插入集合元素直至建立整个TreeSet ...
- javabrideg的使用实践
(1)进入这个网站http://sourceforge.net/projects/php-java-bridge/files,选择Binary package,然后选择最新的版本Php-java-br ...
- spring切面配置,代理用jdk和cglib的区别
jdk的动态代理大家应该都听说过,条件是必须要有接口:cglib不要求接口,那么它是怎么实现切面的呢?很简单,通过继承,它动态的创建出一个目标类的子类,复写父类的方法,由此实现对方法的增强.看例子: ...
- 解决spring 事务管理默认不支持SQLException等运行时异常
公司同事在定位一个bug时,发现spring默认的事务只支持运行时异常的回滚,对于像SQLException这样的非运行时异常,默认的事务机制不能处理,于是找了下解决的办法: 1.在捕获SQLE ...
- linux下安装ZipArchive扩展和libzip扩展
在项目开发的时候,由于要下载多个录音文件,我就需要打包下载这个功能 学习源头: https://www.landui.com/help/show-8079 https://www.aliyun.com ...
- layui与layer同时引入冲突的问题
之前在项目中只有用layer,但是后来有用到了layui,结果发现同时引入这两个东东 会出现冲突的问题 导致代码运行不正常 后来网上找到了解决办法: 学习源头:http://fly.layui.com ...