hdu1247
一道水題,居然改錯改了一個多小時
題目的意思是其實就是找出一個單詞,前半部是一個出現過的單詞,后半部也是,記住,要嚴格滿足這個條件
所以,其實也就是先查找一個單詞的是否有前綴,再用這個單詞除去前綴的部分查找是否存在一個這樣的單詞
雖然題目說按字典序輸出,但本身已經是按字典序輸入了,所以排序也就省了
#include<iostream> #include<string> using namespace std; struct node {int v;node *next[26]; }; node *root; char str[50002][50]; void insert(char *s) {node *p=root;for(;*s!='\0';s++){int d=*s-'a';if(p->next[d]==NULL){p->next[d]=new node();p=p->next[d];}else p=p->next[d];} // cout<<p->v<<endl;p->v=1; } int find2(char *s) {node *p=root;for(;*s!='\0';){int d=*s-'a';if(p->next[d]!=NULL){p=p->next[d];if(p->v==1&&*(s+1)=='\0')//這部分很關鍵,要嚴格滿足return 1;s++;//這里也是,即使上一步沒找到,還得繼續往下查找}else return 0;}return 0; } int find(char *s) {node *p=root;for(;*s!='\0';){int d=*s-'a';p=p->next[d];if(p!=NULL){ if(p->v==1&&find2(s+1))//用除去前綴剩下的部分在find2中查找return 1;s++;}else return 0;}return 0; }int main() {int i=0,j;root=new node();while(scanf("%s",str[i])!=EOF){insert(str[i]);i++;}for(j=0;j<i;j++){if(find(str[j])){ cout<<str[j]<<endl;;}}return 0; }轉載于:https://www.cnblogs.com/nanke/archive/2011/05/15/2046869.html
總結
- 上一篇: 胆结石多少钱啊?
- 下一篇: poj 2528_2