bzoj1622 / P2908 [USACO08OPEN]文字的力量Word Power
P2908 [USACO08OPEN]文字的力量Word Power
第一眼:AC自动机(大雾)
直接暴力枚举即可。
用<cctype>的函数较方便(还挺快)
$isalpha(a)$:$a$是否是字母
$tolower(a)$:$a$把a转成小写
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cctype> 5 #define re register 6 using namespace std; 7 char a[1003][1003],b[103][33]; 8 int n,m,ans,c[103],lena[1003],lenb[103]; 9 int main(){ 10 scanf("%d%d",&n,&m); 11 for(re int i=1;i<=n;++i){ 12 char c=getchar(); 13 while(!isalpha(c)) c=getchar(); 14 while(isalpha(c)) a[i][lena[i]++]=tolower(c),c=getchar(); 15 } 16 for(re int i=1;i<=m;++i){ 17 char c=getchar(); 18 while(!isalpha(c)) c=getchar(); 19 while(isalpha(c)) b[i][lenb[i]++]=tolower(c),c=getchar(); 20 } 21 //----读入字符串------- 22 for(re int i=1;i<=n;++i){ 23 memset(c,0,sizeof(c)); ans=0; 24 for(re int j=0;j<lena[i];++j){ 25 for(re int k=1;k<=m;++k){ 26 if(c[k]==-1) continue; 27 if(b[k][c[k]]==a[i][j]) ++c[k]; 28 if(c[k]==lenb[k]) ++ans,c[k]=-1;//这个子串的字母全出现过了 29 } 30 }printf("%d\n",ans); 31 }return 0; 32 }