P2908 [USACO08OPEN]文字的力量Word Power
第一眼:AC自动机(大雾)
直接暴力枚举即可。
用<cctype>的函数较方便(还挺快)
$isalpha(a)$:$a$是否是字母
$tolower(a)$:$a$把a转成小写
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#define re register
using namespace std;
char a[][],b[][];
int n,m,ans,c[],lena[],lenb[];
int main(){
scanf("%d%d",&n,&m);
for(re int i=;i<=n;++i){
char c=getchar();
while(!isalpha(c)) c=getchar();
while(isalpha(c)) a[i][lena[i]++]=tolower(c),c=getchar();
}
for(re int i=;i<=m;++i){
char c=getchar();
while(!isalpha(c)) c=getchar();
while(isalpha(c)) b[i][lenb[i]++]=tolower(c),c=getchar();
}
//----读入字符串-------
for(re int i=;i<=n;++i){
memset(c,,sizeof(c)); ans=;
for(re int j=;j<lena[i];++j){
for(re int k=;k<=m;++k){
if(c[k]==-) continue;
if(b[k][c[k]]==a[i][j]) ++c[k];
if(c[k]==lenb[k]) ++ans,c[k]=-;//这个子串的字母全出现过了
}
}printf("%d\n",ans);
}return ;
}