ZOJ - 3430 ac自动机

news/2025/1/2 1:09:16/

这题主要就是解码过程很恶心,不能用char存,一共wa了20发

题意:先给n串加密后的字符,然后m串加密后的字符,解码之后求n对应每个m的匹配数,很显然的ac自动机

加密过程是先用对应ascii表的标号来代替字符,然后把这些数字转换成8位的二进制,全部连起来,然后每6位算一个数,用二进制算成整数,最后用这些整数来映射给定的表

题解:反解密就好了,要注意细节,很容易Segmentation Fault,最后算出来的字符用int存,然后跑ac自动机就行了

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1using namespace std;const double g=10.0,eps=1e-7;
const int N=520*64+10,maxn=60000+10,inf=0x3f3f3f;inline void debug(){cout<<"fuck"<<endl;}char s[4000];
int de[4000],sz;
int digit[4000*6];
struct Trie{int tot,root;int Next[N][256],fail[N],End[N];int newnode(){for(int i=0;i<256;i++)Next[tot][i]=-1;End[tot]=0;return tot++;}void init(){tot=0;root=newnode();}void insertstring(int id){int now=root;for(int i=0;i<sz;i++){if(Next[now][de[i]]==-1)Next[now][de[i]]=newnode();now=Next[now][de[i]];}End[now]=id;}void build(){queue<int>q;fail[root]=root;for(int i=0;i<256;i++){if(Next[root][i]==-1)Next[root][i]=root;else{fail[Next[root][i]]=root;q.push(Next[root][i]);}}while(!q.empty()){int now=q.front();q.pop();for(int i=0;i<256;i++){if(Next[now][i]==-1)Next[now][i]=Next[fail[now]][i];else{fail[Next[now][i]]=Next[fail[now]][i];q.push(Next[now][i]);}}}}bool vis[550];int query(int n){int now=root;memset(vis,0,sizeof vis);for(int i=0;i<sz;i++){now=Next[now][de[i]];int te=now;while(te!=root){if(End[te])vis[End[te]]=1;te=fail[te];}}int res=0;for(int i=1;i<=n;i++)if(vis[i])res++;return res;}
};
int getnew(char x)
{if(x>='A'&&x<='Z')return x-'A';if(x>='a'&&x<='z')return x-'a'+26;if(x>='0'&&x<='9')return x-'0'+52;if(x=='+')return 62;else return 63;
}
void change(char s[])
{sz=0;int len=strlen(s);while(s[len-1]=='=')len--;vector<int>v;for(int i=0;i<len;i++)v.pb(getnew(s[i]));memset(digit,0,sizeof digit);for(int i=0;i<v.size();i++){for(int j=6*(i+1)-1;j>=6*i;j--){if(v[i]&1)digit[j]=1;v[i]/=2;}}sz=v.size()*6/8;for(int i=0;i<sz;i++){de[i]=0;for(int j=8*i;j<8*(i+1);j++)de[i]=(de[i]<<1)+digit[j];// cout<<de[i]<<" ";
    }// cout<<endl;
}
Trie ac;
int main()
{ios::sync_with_stdio(false);cin.tie(0);int n;while(~scanf("%d",&n)){ac.init();for(int i=1;i<=n;i++){scanf("%s",s);change(s);ac.insertstring(i);}ac.build();int k;scanf("%d",&k);while(k--){scanf("%s",s);change(s);printf("%d\n",ac.query(n));}puts("");}return 0;
}
/****************************************/
View Code

 

转载于:https://www.cnblogs.com/acjiumeng/p/7609463.html


http://www.ppmy.cn/news/216962.html

相关文章

DM3730 x-loader 分析 六 UART

一. UART初始化 1.先配置MUX_DEFAULT&#xff0c;使需要使用UART管脚有效 2.配置相应寄存器&#xff0c;针对x-loader/Drivers/Ns16550.c文件&#xff0c;总结一个便于分析表格 关于波特率的产生&#xff0c;先看sprugn4r.pdf截图 可见波特率的产生需要&#xff0c;48MHz&…

【JZOJ 3430】DY引擎

Description BOSS送给小唐一辆车。小唐开着这辆车从PKU出发去ZJU上课了。 众所周知&#xff0c;天朝公路的收费站超多的。经过观察地图&#xff0c;小唐发现从PKU出发到ZJU的所有路径只会有N&#xff08;2<N<300&#xff09;个不同的中转点&#xff0c;其中有M&#xf…

HDU3430-扩展中国剩余定理

刚开始一直把题意看错了。。。体测完智商急剧下降 正确理解题意以后自己写一直wa&#xff0c;而且并不知道是哪里的问题&#xff0c;在网上看了一下其他人写的改了改自己的就过了&#xff0c;可是之前的还是不知道为什么不对。 题意大概就是有一个置换群&#xff0c;问运算多…

ZOJ 3430. Detect the Virus

链接 https://zoj.pintia.cn/problem-sets/91827364500/problems/91827368613 题意 找文本串中有多少种不同的模式串 思路 AC 自动机 按要求转码后套板子 代码 #include<bits/stdc.h> using namespace std; const int N5e45; const int M256; int n,m,mp[M],temp…

【HDU 3430】中国剩余定理

题意&#xff1a;洗牌&#xff0c;1-n的序列&#xff0c;按照序列1的形式变化&#xff0c;问需要多少次操作可以变成序列2&#xff0c;若无输出-1&#xff1b; 题解&#xff1a;先找到循环规律&#xff0c;发现每位的变化情况若是可以到达&#xff0c;则存在循环节&#xff0c…

2023年第十五届四川赛区ACM真题及官方题解

给大家看真题前&#xff0c;先给大家看看现场氛围 入场前&#xff1a; 结束后&#xff1a; 还是有点壮观的。 今年四川的ACM在都江堰举办。因为比赛时间很紧张&#xff0c;所以没来得及去公费旅个游哈哈&#xff0c; 不过题目很棒&#xff0c;志愿者效率很高&#xff0c;比赛…

am335x reboot 命令分析

本文记录am335x运行reboot命令时&#xff0c;内核中运行过程。 Tony Liu, 2016-6-8, Shenzhen 参考链接&#xff1a;http://blog.csdn.net/wavemcu/article/details/8544333 kernel/sys.c void kernel_restart(char *cmd) {kernel_restart_prepare(cmd); …

zoj3430ac自动机

动态存储ME int lis[3000] ;/*AC------------*/ int next[520*64][256] ; int fail[520*64] ; int id[520*64] ; struct AC{int root , n ;int newnode(){for(int i 0 ; i < 256 ; i) next[n][i] -1 ;id[n] -1 ;return n-1 ;}void init(){n 0 ;root newn…