@[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