传送门

nmdwsm

自己看吧,不想写了qwq

垃圾代码如下 和题解完全不一样

#define LL long long
#define uLL unsigned long long
#define il inline
#define re register using namespace std;
const int M=1e7+10,N=1e5+10;
il int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
uLL hb[M],bb[M],bs=2333;
vector<char> cc[N];
int l[N],r[N],s[N];
bool v[N];
string fk; int main()
{
freopen("3574.in","r",stdin);
freopen("3574.out","w",stdout);
bb[0]=1;
for(int i=1;i<M-1;++i) bb[i]=bb[i-1]*bs;
int T=rd();
while(T--)
{
int n=rd();
for(int i=0;i<=n;++i) v[i]=0;
int m=0;
char ch;
/*while(233)
{
ch=getchar();
if(ch=='\n'||ch==-1)
{
++m;
if(m>=n) break;
l[m]=0,r[m]=-1,cc[m].clear();
}
else ++r[m],cc[m].push_back(ch);
}*/
for(int i=0;i<n;++i)
{
l[i]=0,cc[i].clear();
cin>>fk;
//int nmd=((int)fk.length())-1;
r[i]=((int)fk.length())-1;
for(int j=l[i];j<=r[i];++j) cc[i].push_back(fk[j]);
}
m=n;
while(233)
{
int i=0;
ch=0;
while(i<m)
{
int j=i;
if(l[j]>r[j]) break;
if(cc[j][l[j]]=='*') break;
if(!ch||ch==cc[j][l[j]]) ch=cc[j][l[j]];
else break;
++i;
}
if(i<m||!ch) break;
for(int j=0;j<m;++j) ++l[j];
}
while(233)
{
int i=0;
ch=0;
while(i<m)
{
int j=i;
if(l[j]>r[j]) break;
if(cc[j][r[j]]=='*') break;
if(!ch||ch==cc[j][r[j]]) ch=cc[j][r[j]];
else break;
++i;
}
if(i<m||!ch) break;
for(int j=0;j<m;++j) --r[j];
}
uLL ha=0;
int h=0,px=0,py=1;
while(h<n)
{
uLL hh=0;
bool o=0;
for(int i=l[h];i<=r[h];++i)
{
if(cc[h][i]!='*') hh=hh*bs+cc[h][i];
else o=1;
}
if(o) {++h;continue;}
v[h]=1;
if(!px||ha==hh) px=1,ha=hh;
else py=0;
++h;
}
if(!py) {puts("N");continue;}
if(px)
{
int i,ma=0;
for(i=0;i<n;++i)
if(v[i]) {swap(cc[i],cc[0]),swap(v[i],v[0]),swap(l[i],l[0]),swap(r[i],r[0]);break;}
for(i=0;i<n;++i) ma=max(ma,r[i]);
hb[0]=cc[0][0];
for(i=1;i<=r[0];++i) hb[i]=hb[i-1]*bs+cc[0][i];
for(i=r[0]+1;i<=ma;++i) hb[i]=0;
for(i=1;i<n;++i)
{
if(v[i]) continue;
ha=0;
int j=l[0],k=r[0],ll=0;
while(l[i]<=r[i]&&j<=k&&cc[i][l[i]]==cc[0][j]) ++l[i],++j;
while(l[i]<=r[i]&&j<=k&&cc[i][r[i]]==cc[0][k]) --r[i],--k;
if(l[i]<=r[i]&&(cc[i][l[i]]!='*'||cc[i][r[i]]!='*')) break;
while(l[i]<=r[i]&&j<=k)
{
if(cc[i][l[i]]!='*') ++ll,++j,ha=ha*bs+cc[i][l[i]];
else
{
if(ll)
{
while(j<=k&&ha!=hb[j]-hb[j-ll]*bb[ll]) ++j;
if(j>k) l[i]=-233;
}
ll=0,ha=0;
}
++l[i];
}
while(l[i]>=0&&l[i]<=r[i]&&cc[i][l[i]]=='*') ++l[i];
if(l[i]<=r[i]) break;
}
puts(i>=n?"Y":"N");
continue;
}
for(int i=0;i<n;++i) s[i]=i;
m=n;
while(233)
{
int i=0;
ch=0;
while(i<m)
{
int j=s[i];
if(l[j]>r[j]) break;
if(cc[j][l[j]]=='*') swap(s[i],s[m-1]),--m,--i;
else if(!ch||ch==cc[j][l[j]]) ch=cc[j][l[j]];
else break;
++i;
}
if(i<m||!ch) break;
for(int j=0;j<m;++j) ++l[s[j]];
}
for(int i=0;i<n;++i) s[i]=i;
m=n;
while(233)
{
int i=0;
ch=0;
while(i<m)
{
int j=s[i];
if(l[j]>r[j]) break;
if(cc[j][r[j]]=='*') swap(s[i],s[m-1]),--m,--i;
else if(!ch||ch==cc[j][r[j]]) ch=cc[j][r[j]];
else break;
++i;
}
if(i<m||!ch) break;
for(int j=0;j<m;++j) --r[s[j]];
}
int c1=0,c2=0;
for(int i=0;i<n;++i) c1+=l[i]>r[i]||v[i],c2+=l[i]<=r[i]&&cc[i][l[i]]=='*'&&cc[i][r[i]]=='*';
puts(c1==n||c2==n?"Y":"N");
}
return 0;
}

md我是真的\(**\),分类讨论没考虑完全,数组开小,局部变量开的过大,没清空数组,没考虑空行,然后写了一万年,,,

8说了

luogu P3234 [HNOI2014]抄卡组的更多相关文章

  1. bzoj3574[Hnoi2014]抄卡组

    http://www.lydsy.com/JudgeOnline/problem.php?id=3574 我们发现如果所有的字符串都有*,那么只需要比较他们的“前缀”和“后缀”相同即可.“前缀”指第一 ...

  2. 【LG3234】[HNOI2014]抄卡组

    题面 题解 分三种情况: 若所有串都没有通配符,直接哈希比较即可. 若所有串都有通配符, 把无通配符的前缀 和 无通配符的后缀哈希后比较即可. 中间部分由于通配符的存在,一定可以使所有串匹配. 若部分 ...

  3. BZOJ3574 HNOI2014抄卡组(哈希)

    容易发现通配符中间的部分可以任意匹配,会造成的无法匹配的仅仅是前后缀,前缀和后缀可以分别独立处理.如果字符串均有通配符,只需要按前/后缀长度排序然后暴力匹配就可以了. 问题在于存在无通配符的字符串.显 ...

  4. [HNOI2014]抄卡组

    [Luogu3234] [LOJ2208] 题解及代码 锻炼哈希码力的一道题 , 具体细节见代码 #include<cstdio> #include<cstring> #inc ...

  5. 洛谷P3234 抄卡组 [HNOI2014] 字符串hash

    正解:字符串hash 解题报告: 传送门! 字符串hash是字符串匹配中很常见的一个方法,原理也很好懂,这里就不做太多阐述辣有时间放到hash笔记里面去QAQ 题意不说了挺好理解的,自带一句话概括好评 ...

  6. 【HNOI2014】抄卡组

    题面 题解 如果所有的字符串都有通配符,那么只要比较不含通配符的前缀和后缀就可以了. 否则一定有一个串没有通配符.找出这个字符串,然后将所有串与这个串匹配,通配符将\(B\)分成一段一段在\(A\)上 ...

  7. 【LOJ6254】最优卡组 堆(模拟搜索)

    [LOJ6254]最优卡组 题面 题解:常用的用堆模拟搜索套路(当然也可以二分).先将每个卡包里的卡从大到小排序,然后将所有卡包按(最大值-次大值)从小到大排序,并提前处理掉只有一张卡的卡包. 我们将 ...

  8. HearthBuddy卡组

    偶数萨 手打两天已上传说,各位加油  欧洲牧羊人 ### 火元素换艾雅# 职业:萨满祭司# 模式:狂野模式## 2x (2) 图腾魔像        # 2x (2) 大漩涡传送门   # 2x (2 ...

  9. 服务器&阵列卡&组raid 5

    清除raid信息后,机器将会读不到系统, 后面若进一步操作处理, raid信息有可能会被初始化掉,那么硬盘数据就有可能会被清空, 导致数据丢失, 否则如果只是清除raid信息,重做raid是可以还原系 ...

随机推荐

  1. JS监听滚动条进度

    HTML部分: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <s ...

  2. C# Winform多窗体&&构造函数传值

    一.多窗体:三种打开窗体的状态: 最最基础的弹窗: //写在按钮的点击事件内: //实例需要弹出的窗口的类: Form2 f2 = new Form2(); f2.Show(); 1.弹窗窗口: // ...

  3. 洛谷P2831 愤怒的小鸟 + 篮球比赛1 2

    这三道题一起做,有一点心得吧. 愤怒的小鸟,一眼看上去是爆搜,但是实现起来有困难(我打了0分出来). 还有一种解法是状压DP. 抛物线一共只有那么多条,我们枚举抛物线(枚举两个点),这样就能够预处理出 ...

  4. 洛谷P3975 弦论

    题意:求一个串的字典序第k小的子串/本质不同第k小的子串. 解:一开始我的想法是在后缀树上找,但是不知道后缀树上的边对应的是哪些字符... 然而可以不用fail树转移,用转移边转移即可. 先建一个后缀 ...

  5. java开发JDBC连接数据库代码

    JDBC连接数据库,创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 这通过java.lang.Class类的静态方法forName(String className)实 ...

  6. ImageMagick: win7 | win8 & uac (用户帐户控制) 注册表的一些事

    现在用win7,win8的人越来越多了, 程序在一些 win 7, win8 上运行会遇到一些之前没想过的兼容性问题. 比如 64位系统运行32位程序时的注册表重定向,还有因为 uac (用户帐户控制 ...

  7. zlib库交叉编译

    zlib-1.2.11 开发板:arm9 交叉编译器arm-fsl-linux-gnueabihf-gcc 编译方式: ./configure -h可以发现zlib并没有提供CC配置,所以 (1)ex ...

  8. python学习笔记-列表和字典

    由于最近在看深度学习的代码,看到需要建立字典和列表来存储什么东西的时候,就想要去把字典和列表好好的了解清楚,其应用范围,差别,等等东西 首先我们来介绍,在python中存在如下的数据结构:列表list ...

  9. C#Windows服务程序安装常见问题解决方法

    C#Windows服务程序安装是如何的呢?让我们开始吧: C#Windows服务程序安装1. 在服务程序的是设计窗体中,点击右键“添加安装程序”,添加服务安装程序.否则,安装时会出现如下 错误: 正在 ...

  10. (Bash博弈 大数) 51nod1068 Bash游戏 V3

    1068 Bash游戏 V3   有一堆石子共有N个.A B两个人轮流拿,A先拿.每次拿的数量只能是2的正整数次幂,比如(1,2,4,8,16....),拿到最后1颗石子的人获胜.假设A B都非常聪明 ...