月赛最后一题40分救助

题目总版

@[zxyall](/user/1067001) 做法假了,```else b=0;```这里错了,失配了指针 $b$ 肯定是不能跳到初始位置的,我赛时的思路是把子串哈希然后用类似于 KMP 的思路去匹配 。 你的做法很好hack: ``` ba ba pa po ba ba ba pu po ``` 然后你匹配到第三位发现失配了就寄了
by 羊羊君的幻想 @ 2024-03-08 23:08:14


@[羊羊君的幻想](/user/416038) 感谢指点!
by zxyall @ 2024-03-09 09:08:21


@[羊羊君的幻想](/user/416038) 数据范围小,写个暴力循环检查过了~
by zxyall @ 2024-03-09 09:24:32


``` #include<bits/stdc++.h> using namespace std; unordered_map<char,bool>mp={{'a',1},{'e',1},{'i',1},{'o',1},{'u',1}}; vector<string>v[20]; int n,q; void work(int k,string s){//拆音节,特判n的情况 for(int i=0,j=0;i<s.size();i++){ j=i; while(j<s.size()&&mp[s[j]]!=1&&s[i]!='n')j++; if(s[j]=='n'&&mp[s[j+1]])j++; else if(s[j]=='n'&&!s[j+1]){ if(j>i)v[k].push_back(s.substr(i,j-i)); v[k].push_back("n"); j++; i=j; continue; } v[k].push_back(s.substr(i,j-i+1)); if(j>i)i=j; } } bool calc(int x){ int n=v[0].size(),m=v[x].size(); for(int i=0;i<=n-m;i++){ if(v[0][i]==v[x][0]){ int flag=1; for(int j=1,k=i+1;j<m&&k<n;k++,j++){ if(v[0][k]!=v[x][j]){ flag=0; break; } } if(flag)return true; } } return false; } bool check(string s){ int cnt=0; v[0].clear(); work(0,s);//v[0]记录当前要检查字符串的音节 for(int i=1;i<=n;i++){ if(calc(i))cnt++; if(cnt>=2)return false; } if(cnt==1)return true; return false; } int main(){ cin>>n>>q; for(int i=1;i<=n;i++){ string ss;cin>>ss; work(i,ss); } while(q--){ string s;cin>>s; if(check(s))puts("Yes, Commander"); else puts("No, Commander"); } //for(auto x:v[0])cout<<x<<' '; return 0; } ```
by zxyall @ 2024-03-09 18:37:12


|